2009-02-04 22 views

Respuesta

10

Sí, esa es la única forma que conozco.

Pero debe controlar el hecho de que GFW puede devolver NULL. Normalmente, esto sucede cuando otro escritorio (por ejemplo, el escritorio del protector de pantalla) está activo. Tenga en cuenta que el uso de una contraseña de ahorro puede afectar el uso de un escritorio diferente (esto depende de la versión de Windows y no recuerdo los detalles de cómo funcionan las diferentes versiones).

También este código no funcionará correctamente en el modo de depuración en Visual Studio, porque obtendrá el identificador de ventana de VS.

Aparte :-) color de rosa de que todo

1

Sí que son correctas a menos que se desea comprobar ActiveWindow de cada hilo.

1

Supongo que se refiere a la ventana que tiene el foco de entrada cuando dices "ventana activa"?

En ese caso, olvide la API GetForegroundWindow(). Eso devolverá la ventana superior, no siempre la ventana que tiene el foco de entrada.

Use GetFocus() en su lugar.

+0

Eso es falso: "GetFocus devuelve la ventana con el foco del teclado para el actual cola de mensajes del hilo. [...] Use la función GetForegroundWindow para recuperar el identificador de la ventana con la que el usuario está trabajando actualmente ". –

+0

Como dije: "si te refieres a la ventana que tiene el foco de entrada". – Stefan

+0

Sí, me refiero a la ventana en la que el usuario está trabajando. Gracias –

1

Puede intentar utilizar el mensaje WM_ACTIVATEAPP.
En primer lugar definir una variable bool bool wActive = false, en el procedimiento de WndProc, aquí es la siguiente pieza de código:

case WM_ACTIVATEAPP: 
    wActive = (bool)wParam; 
return 0; 

se puede ir a MSDN encontrar más información acerca de WM_ACTIVATEAPP

0

Sí, GetForgroundWindow() se una buena manera de verificar, se comporta correctamente incluso con una ventana "Siempre en la parte superior" alias HWND_TOPMOST.

Otra forma es con GetActiveWindow()

HWND temp = GetActiveWindow(); 
    if (temp == hWnd) // Then your current window has focus 

Como alternativa, los siguientes mensajes de informe si el foco ha cambiado

case WM_KILLFOCUS: 
     // windowHasFocus = false 
    break; 

    case WM_SETFOCUS: 
     // windowHasFocus = true; 
    break; 
Cuestiones relacionadas