Подтвердить что ты не робот

Изменено ли системное событие Windows в активном окне?

Настольное приложение, которое я разрабатываю, должно знать, какие окна были активны во время запуска приложения. В настоящее время он выполняет вызов GetForegroundWindow() (user32.dll) каждые 250 мс. Этот подход не очень точен.

Есть ли какое-либо событие Windows (WINAPI?), которое срабатывает при каждом изменении активного (сфокусированного) окна? Я хотел бы подписаться на мою функцию обратного вызова.

Спасибо.

4b9b3361

Ответ 1

Да, вы можете использовать функцию 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 */
}

Ответ 2

Там сообщение WM_ACTIVATE, которое отправляется в активированные и дезактивированные окна.