2010-12-10 90 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

相关问题