c++ - 使用 SetWinEventHook() 时如何定义消息循环?
问题描述
我正在尝试在我不拥有源的第三方应用程序窗口中收听事件。
我不明白这部分文档说:
调用 SetWinEventHook 的客户端线程必须有一个消息循环才能接收事件。
我如何“定义”这个消息循环?
在我的钩子代码中,它永远不会到达switch
:
void CALLBACK WinEventProc(
HWINEVENTHOOK hWinEventHook,
DWORD event,
HWND hwnd,
LONG idObject,
LONG idChild,
DWORD dwEventThread,
DWORD dwmsEventTime
)
{
switch (event) {
case EVENT_SYSTEM_MINIMIZESTART:
...
break;
case EVENT_SYSTEM_MINIMIZEEND:
...
break;
}
}
HWINEVENTHOOK hWinEventHook;
int EventHook() {
hWinEventHook = SetWinEventHook(
EVENT_SYSTEM_MINIMIZESTART, // eventMin
EVENT_SYSTEM_MINIMIZEEND, // eventMax
NULL, // hmodWinEventProc
WinEventProc, // pfnWinEventProc
4834, // idProcess
0, // idThread
WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); //dwFlags
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::thread t1(EventHook);
...
}
我按照评论中的建议修改了代码,但现在我的程序崩溃了;
它到达线路时崩溃:
while (GetMessage(&msg, NULL, 0, 0))
解决方案
在调用 SetWinEventHook 之后,消息循环需要在 main 中。而且由于您没有其他方式让程序退出,您可能希望创建一个带有退出按钮的对话框,并在该按钮的处理程序中 BN_CLICKED 使用对 MessageBox 的调用来确认用户想要退出如果是这样,请执行 PostQuitMessage)。确认是因为否则太容易退出了。
推荐阅读
- php - 如何在 osTicket 中实现客户回复 API
- apache-kafka - Kafka Streams:当kafka流将数据写入目标主题时如何捕获事件
- c# - 有没有办法找出一个方法是否被同一个对象递归调用?
- c++ - 如何在不定义其他函数 getValue() 的情况下获取私有值?
- c++ - 如何在 CMake 中测量每个对象的编译时间?
- node.js - 无法安装 postgres-passport
- python - 为什么 print 参数刷新默认为 False?
- django - 嵌套查询过滤器_Django
- c# - 如何使用 PhantomJS 和 Selenium 单击离子按钮
- python - 如何区分浮点形式的int?