【问题标题】:PostMessage not working with posting custom messagePostMessage 不适用于发布自定义消息
【发布时间】:2020-02-07 17:52:48
【问题描述】:

我用过

PostMessage(NULL,WM_DUCKWND,0,0);

在哪里

#define WM_DUCKWND (WM_USER +4)

将用户定义的消息发送到当前线程中的所有窗口。

详情

这是直接在主函数中 (DUCKPROC_CLASS_MSG_NAME 和 DUCKPROC_WINDOW_MSG_NAME 都是用户自定义的宏)

    //create message-only window

    WNDCLASS wndc={};
    wndc.lpfnWndProc = MsgWindowProc;
    wndc.hInstance = hInstance;
    wndc.lpszClassName = DUCKPROC_CLASS_MSG_NAME;
    RegisterClass(&wndc);

    auto hw=CreateWindowEx(NULL, DUCKPROC_CLASS_MSG_NAME, DUCKPROC_WINDOW_MSG_NAME, NULL, 0, 0, 0, 0, HWND_MESSAGE, NULL, hInstance, NULL);


    //post

    PostMessage(NULL,WM_DUCKWND,0,0);


    //message loop

    MSG msg = {};
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

并像这样使用 WindProc

LRESULT CALLBACK MsgWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DUCKWND:

[BREAKPOINT][BREAKPOINT][BREAKPOINT][BREAKPOINT]

        return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

但是,断点并未按预期触发。

怎么回事?

【问题讨论】:

    标签: c++ c windows winapi window


    【解决方案1】:

    "当前线程中的所有窗口。"

    不,这是不正确的。 HWND==NULL 将消息发送到 thread 消息队列。这就是您使用 GetMessage(HWND==NULL) 循环处理的消息队列。

    DispatchMessage 是在msg 中查看HWND 并选择正确窗口进程的函数。它通过查找该 HWND 的窗口类来实现。

    由于HWND==NULL 没有窗口类,它也没有窗口进程,并且消息不会分派到任何窗口。

    如果您想将WM_DUCKWND(HWND==NULL) 发送到您的所有窗口,您必须自己发送它。在这个简单的示例中,就像将 msg.hWnd=hw 设置为 msg.message==WM_DUCKWND && msg.hWnd==NULL 一样简单。

    旁注:确实应该是WM_APP+4WM_USER 范围用于窗口类内部的消息。线程消息队列是windows共享的,所以不要给它发WM_USER消息。

    【讨论】: