PostMessage无法与发布自定义消息一起使用

时间:2019-10-10 09:59:14

标签: c++ c windows winapi window

我用过

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);
}

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

怎么了?

1 个答案:

答案 0 :(得分:2)

“当前线程中的所有窗口。”

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

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

由于HWND==NULL没有窗口类,因此它也没有窗口proc,并且消息也没有分派到任何窗口。

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

旁注:确实应该为WM_APP+4WM_USER范围用于窗口类内部的消息。线程消息队列由Windows共享,因此您不应向其发布WM_USER条消息。