2010-12-10 75 views
22

我正在開發的桌面應用程序需要知道在應用程序運行時哪些窗口處於活動狀態。目前它每250毫秒執行GetForegroundWindow()呼叫(的user32.dll)。這種方法不是很準確。活動窗口上是否有Windows系統事件更改?

是否有任何Windows(WINAPI?)事件會在每次激活(聚焦)窗口改變時觸發?我想訂閱我的回調函數。

謝謝。

+2

一個很好的答案在這裏:http://stackoverflow.com/a/11943387/134761 – angularsen 2012-09-28 12:15:19

回答

28

是的,您可以使用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

看起來像這是我一直在尋找的。讓我檢查一下。 – 2010-12-10 10:16:06

+0

我從來沒有嘗試過EVENT_SYSTEM_FOREGROUND,但我吸引了EVENT_OBJECT_LOCATIONCHANGE事件來處理窗口位置與SetWinEventHook的變化,它對我來說工作得很好。 – DReJ 2010-12-10 10:19:33

+6

爲什麼有C/C++問題的C/C++答案? – Chris 2015-10-22 19:52:44

2

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

+5

這不是我正在尋找的人。訂閱系統中的每個窗口都是不合理的。 :) – 2010-12-10 10:14:18

+0

@Vasiliy Borovyak:啊,不要緊,然後 - 我誤解了,認爲你只需要一個特定窗口的活動狀態。 – Piskvor 2010-12-10 10:18:57

相關問題