¿Hay algún cambio en el evento del sistema de Windows en la ventana activa?

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.

¿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 callback.

Gracias.

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 */ } 

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