Determine si la aplicación actual está activada (tiene foco)

Nota: Hay una pregunta muy similar , pero es específica de WPF; este no es

¿Cómo puedo determinar si la aplicación actual está activada (es decir, tiene foco)?

Esto funciona:

/// Returns true if the current application has focus, false otherwise public static bool ApplicationIsActivated() { var activatedHandle = GetForegroundWindow(); if (activatedHandle == IntPtr.Zero) { return false; // No window is currently activated } var procId = Process.GetCurrentProcess().Id; int activeProcId; GetWindowThreadProcessId(activatedHandle, out activeProcId); return activeProcId == procId; } [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] private static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId); 

Tiene la ventaja de ser seguro para subprocesos, no requiere la forma principal (o su identificador) y no es específico de WPF o WinForms. Funcionará con ventanas secundarias (incluso las independientes creadas en un hilo separado). Además, no se requiere configuración.

La desventaja es que usa un poco de P / Invoke, pero puedo vivir con eso 🙂

dado que es probable que algún elemento en su UI tenga foco para que la forma esté activa, intente:

 this.ContainsFocus 

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.containsfocus(v=vs.110).aspx

Puede suscribirse al evento Activado de la ventana principal

La solución que encontré que no requiere llamadas nativas ni requiere el manejo de eventos es verificar Form.ActiveForm . En mis pruebas, eso fue null cuando no se enfocaba ninguna ventana en la aplicación y, por lo demás, no era nula.

 var windowInApplicationIsFocused = Form.ActiveForm != null; 

Ah, esto es específico para winforms. Pero eso se aplica a mi situación ;-).

Maneje el evento Activado de su formulario de solicitud principal.

Primero obtenga el mango ya sea usando:

IntPtr myWindowHandle;

 myWindowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle; 

o

 HwndSource source = (HwndSource)HwndSource.FromVisual(this); myWindowHandle = source.Handle; 

Luego compara si es ForeGroundWindow:

 if (myWindowHandle == GetForegroundWindow()) { // Do stuff! } [DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); 

En WPF, la manera más fácil de verificar si una ventana está activa es:

 if(this.IsActive) { //the window is active }