2009-01-21 35 views
17

Usando la API de Win32 (en C, pero eso no tiene importancia) ¿cómo puedo saber si una ventana dada (identificada por HWND) tiene foco? Estoy conectando una aplicación viendo un evento, y cuando ocurre ese evento, quiero verificar si la aplicación ya tiene foco. Si no es así, quiero mostrar la ventana hasta que le den el foco.¿Cómo puedo saber si una ventana tiene foco? (API Win32)

De forma alternativa, ¿el indicador struct FLASHW_TIMERNOFG de FlashWindowEx parpadea hasta que la ventana tiene foco simplemente no parpadea si la ventana ya tiene foco? No puedo probar esto ahora ya que no estoy en mi entorno de desarrollo, pero tenía la impresión de que parpadearía de todos modos, que es lo que estoy tratando de evitar.

Editar: Además, si es importante, la aplicación utiliza DirectX en esta ventana.

+0

¿Desea preguntarse, "esta ventana tiene el foco" o "¿tiene alguna de las ventanas de esta aplicación el foco"? – ChrisW

+0

Noté en un comentario a continuación que esta aplicación solo tendrá una ventana. –

Respuesta

23

GetActiveWindow devolverá la ventana de nivel superior que está asociada con el foco de entrada. GetFocus devolverá el control de la ventana que tiene el foco de entrada.

Este artículo podría ayudar:
http://www.microsoft.com/msj/0397/Win32/Win320397.aspx

+0

¡Esa utilidad es asombrosa! –

+0

El enlace ya no está disponible en su ubicación mostrada, pero está disponible como archivado: [web.archive.org/web/200308](https://web.archive.org/web/20030807084141/http://www. microsoft.com/msj/0397/Win32/Win320397.aspx) – Sabuncu

7

¿Realmente quieres decir "foco" o quieres decir "activo?"

Una ventana tiene el foco - la que está primero en la fila para obtener eventos de teclado. La ventana externa (que el usuario puede arrastrar por la pantalla) está "activa" si una de sus subventanas tiene el foco, pero puede o no tener el foco.

+1

La aplicación solo tendrá una sola ventana, ninguna subventana o ventanas secundarias. –

13

Además gkrogers respuesta usando GetActiveWindow, también puede mantener una variable booleana para la ventana que desea saber si tiene el foco o no al atrapar los WM_SETFOCUS y WM_KILLFOCUS eventos, o WM_ACTIVATE

WndProc() .. 
case WM_SETFOCUS: 
    puts("Got the focus") ; 
    break ; 

case WM_KILLFOCUS: 
    puts("Lost the focus") ; 
    break; 

case WM_ACTIVATE: 
    if(LOWORD(wparam) == WA_ACTIVE) 
    puts("MEGAZORD ACTIVATED kew kew kew (flashy-eyes)") ; 
    else 
    puts("I AM NOW INACTIVE.") ; 
    break ; 
+0

Me encanta el ejemplo. – Xcalibur37

4

función uso GetForegroundWindow para obtener el Hwnd que se están centrando en este momento. Entonces solo necesita compararlo con la ventana de su aplicación para verificar si contiene foco o no.

Cuestiones relacionadas