我正在开发的桌面应用程序需要知道在应用程序运行时哪些窗口处于活动状态。目前它每250毫秒执行GetForegroundWindow()
呼叫(的user32.dll
)。这种方法不是很准确。活动窗口上是否有Windows系统事件更改?
是否有任何Windows(WINAPI?)事件会在每次激活(聚焦)窗口改变时触发?我想订阅我的回调函数。
谢谢。
我正在开发的桌面应用程序需要知道在应用程序运行时哪些窗口处于活动状态。目前它每250毫秒执行GetForegroundWindow()
呼叫(的user32.dll
)。这种方法不是很准确。活动窗口上是否有Windows系统事件更改?
是否有任何Windows(WINAPI?)事件会在每次激活(聚焦)窗口改变时触发?我想订阅我的回调函数。
谢谢。
是的,您可以使用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 */
}
有WM_ACTIVATE message,它被发送到激活和停用的窗口。
这不是我正在寻找的人。订阅系统中的每个窗口都是不合理的。 :) – 2010-12-10 10:14:18
@Vasiliy Borovyak:啊,不要紧,然后 - 我误解了,认为你只需要一个特定窗口的活动状态。 – Piskvor 2010-12-10 10:18:57
一个很好的答案在这里:http://stackoverflow.com/a/11943387/134761 – angularsen 2012-09-28 12:15:19