首页 > 解决方案 > 使用 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))

碰撞

标签: c++winapihook

解决方案


在调用 SetWinEventHook 之后,消息循环需要在 main 中。而且由于您没有其他方式让程序退出,您可能希望创建一个带有退出按钮的对话框,并在该按钮的处理程序中 BN_CLICKED 使用对 MessageBox 的调用来确认用户想要退出如果是这样,请执行 PostQuitMessage)。确认是因为否则太容易退出了。


推荐阅读