2010-12-10 6 views
22

La aplicación de escritorio que estoy desarrollando necesita saber qué ventanas estaban activas mientras se ejecutaba la aplicación. Actualmente realiza la llamada GetForegroundWindow() (de user32.dll) cada 250 mseg. El enfoque no es muy preciso.¿Se modificó el evento del sistema de Windows en la ventana activa?

¿Hay algún evento de Windows (WINAPI?) Que se active cada vez que cambie la ventana activa (enfocada)? Me gustaría suscribirme con mi función de devolución de llamada.

Gracias.

+2

Una muy buena respuesta está aquí: http://stackoverflow.com/a/11943387/134761 – angularsen

Respuesta

28

Sí, puede usar la función SetWinEventHook.

hEvent = SetWinEventHook(EVENT_SYSTEM_FOREGROUND , 
    EVENT_SYSTEM_FOREGROUND , NULL, 
    WinEventProcCallback, 0, 0, 
    WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 

....... 

VOID CALLBACK WinEventProcCallback (HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) 
{ 
    /* your code here */ 
} 
+1

Parece que este es el que estaba buscando. Déjame verificarlo. –

+0

Nunca he probado EVENT_SYSTEM_FOREGROUND, pero conecté EVENT_OBJECT_LOCATIONCHANGE evento para manejar el cambio de posición de Windows con SetWinEventHook y funcionó bien para mí. – DReJ

+6

¿Por qué hay una respuesta C/C++ a una pregunta C#? – Chris

2

Está el WM_ACTIVATE message, que se envía a las ventanas activadas y desactivadas.

+5

Esto no es el que yo estoy buscando. No es razonable suscribirse a todas las ventanas del sistema. :) –

+0

@Vasiliy Borovyak: Ah, no importa, he malentendido, pensando que solo necesita el estado activo de una ventana específica. – Piskvor

Cuestiones relacionadas