活动窗口上的Windows系统事件是否已更改?

时间:2010-12-10 10:01:32

标签: c# .net windows winapi hook

我正在开发的桌面应用程序需要知道在运行应用程序时哪些窗口处于活动状态。目前,它每250毫秒执行GetForegroundWindow()次呼叫(user32.dll)。这种方法不是很准确。

是否有任何Windows(WINAPI?)事件在每次活动(聚焦)窗口更改时触发?我想订阅我的回调函数。

感谢。

2 个答案:

答案 0 :(得分:31)

是的,您可以使用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 :(得分:2)

WM_ACTIVATE message,它被发送到激活和停用的窗口。