gpt4 book ai didi

c++ - SetWinEventHook 不捕获任何事件

转载 作者:太空狗 更新时间:2023-10-29 21:03:53 29 4
gpt4 key购买 nike

这是这个问题的后续:Alt Tab overlay Win32 identificator .

我尝试使用 Winuser API 中的 SetWinEventHook 函数捕捉 alt-tab 切换菜单打开(和退出)的时刻。 但是, Hook 不会捕获任何事件(例如最小化窗口),因此不会调用 HandleWinEvent

以下代码极大地受到了 MSDN page 上提供的代码的启发。

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif

#ifndef WINVER
#define WINVER 0x0501
#endif

#include "conio.h"
#include <windows.h>
#include <iostream>


// Global variable.
HWINEVENTHOOK g_hook;

// Prototype
void HandleWinEvent(HWINEVENTHOOK , DWORD , HWND ,
LONG , LONG ,
DWORD , DWORD );

// Initializes COM and sets up the event hook.
//
void InitializeMSAA()
{
CoInitialize(NULL);
g_hook = SetWinEventHook(
EVENT_MIN ,EVENT_MAX, // Range of events .
NULL, // Handle to DLL.
HandleWinEvent, // The callback.
0, 0, // Process and thread IDs of interest (0 = all)
WINEVENT_OUTOFCONTEXT ); // Flags.
}

// Unhooks the event and shuts down COM.
//
void ShutdownMSAA()
{
UnhookWinEvent(g_hook);
CoUninitialize();
}

// Callback function that handles events.
//
void HandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd,
LONG idObject, LONG idChild,
DWORD dwEventThread, DWORD dwmsEventTime)
{
std::cout << std::hex << event ; // desperate attempt to see if any event is caught

if (event == EVENT_SYSTEM_SWITCHSTART)
{
std::cout << "Begin" ;
}
else if (event == EVENT_SYSTEM_SWITCHEND)
{
std::cout << "End ";
}
}



int main()
{
InitializeMSAA();
while( getch()!= 'q' ){;}
ShutdownMSAA();
return 0;
}

构建命令:

g++ -o alttab main.cpp -luser32 -lole32

我使用的是带有 MinGW/GCC 编译器 4.5 版的 Windows XP。

最佳答案

来自 MSDN:调用 SetWinEventHook 的客户端线程必须有一个消息循环才能接收事件。您的主线程等待“q”按钮,而不运行消息循环。

关于c++ - SetWinEventHook 不捕获任何事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12931235/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com