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 ;-).
Manejar el evento activado de su formulario de solicitud principal.
Puedes suscribirte al evento activado de la ventana principal.
ya que es probable que algún elemento en su interfaz de usuario contenga un enfoque para que el formulario esté activo, intente:
this.ContainsFocus
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.containsfocus(v=vs.110).aspx