如何使用SetWinEventHook()函数获取活动窗口更改消息

Dea*_*ock 4 c++ winapi window

我一直在从事需要检测当前活动窗口并连续获取活动窗口标题的项目。任何人都可以向我解释如何使用SetWinEventHook()函数获取“ 活动 窗口”更改消息。[我使用GetForegroundWindow()函数和计时器来获取活动窗口。由于存在计时器,该方法不是很准确。所以我需要将其与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)
{
      /* how to get active window message */
}
Run Code Online (Sandbox Code Playgroud)

Dea*_*ock 5

我找到了解决方案。EVENT_SYSTEM_FOREGROUND事件是缺少的部分。即使前景窗口已更改为另一个窗口,系统也会发送此事件。我们可以使用此事件来获取当前的活动窗口。

VOID CALLBACK WinEventProcCallback ( HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
     if (dwEvent == EVENT_SYSTEM_FOREGROUND)
     {
         /* do something */
     }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,当窗口未最小化时,不会发送“EVENT_SYSTEM_FOREGROUND”事件。 (2认同)