c# .net

c# - Determine si la aplicación actual está activada(tiene enfoque)



.net (7)

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

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

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 enfoque)?


En primer lugar obtener el asa ya sea utilizando:

IntPtr myWindowHandle;

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

o

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

Luego compare si es la ventana de primer plano:

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


Esto funciona:

/// <summary>Returns true if the current application has focus, false otherwise</summary> 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 el formulario principal (o su manejador) 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 ninguna configuración.

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


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

var windowInApplicationIsFocused = Form.ActiveForm != null;

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