Изменено ли системное событие Windows в активном окне? - PullRequest
23 голосов
/ 10 декабря 2010

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

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

Спасибо.

Ответы [ 2 ]

31 голосов
/ 10 декабря 2010

Да, вы можете использовать функцию 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 голосов
/ 10 декабря 2010

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

...