C++ PostMessage不用于发布自定义邮件

C++ PostMessage不用于发布自定义邮件,c++,c,windows,winapi,window,C++,C,Windows,Winapi,Window,我曾经 PostMessage(NULL,WM_DUCKWND,0,0) 在哪里 #定义WM_DUCKWND(WM_USER+4) 将用户定义的消息发送到当前线程中的所有窗口 详细信息 这是直接的主要功能 (DUCKPROC_类_消息_名称和DUCKPROC_窗口_消息_名称都是用户定义的宏) //仅创建消息窗口 WNDCLASS wndc={}; wndc.lpfnWndProc=MsgWindowProc; wndc.hInstance=hInstance; wndc.lpszClassNa

我曾经

PostMessage(NULL,WM_DUCKWND,0,0)

在哪里

#定义WM_DUCKWND(WM_USER+4)

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

详细信息

这是直接的主要功能 (DUCKPROC_类_消息_名称和DUCKPROC_窗口_消息_名称都是用户定义的宏)

//仅创建消息窗口
WNDCLASS wndc={};
wndc.lpfnWndProc=MsgWindowProc;
wndc.hInstance=hInstance;
wndc.lpszClassName=DUCKPROC_CLASS_MSG_NAME;
注册类(&wndc);
auto hw=CreateWindowEx(NULL,DUCKPROC_类_消息_名称,DUCKPROC_窗口_消息_名称,NULL,0,0,0,HWND_消息,NULL,hInstance,NULL);
//职位
PostMessage(NULL,WM_DUCKWND,0,0);
//消息循环
MSG={};
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
像这样使用WindProc

LRESULT回调MsgWindowProc(HWND-HWND、UINT-uMsg、WPARAM-WPARAM、LPARAM-LPARAM)
{
开关(uMsg)
{
案例WM_DUCKWND:
[断点][断点][断点][断点]
返回0;
}
返回DefWindowProc(hwnd、uMsg、wParam、lParam);
}
但是,断点并没有按预期触发

怎么回事?

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

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

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

由于
HWND==NULL
没有窗口类,因此它也没有窗口进程,并且消息不会发送到任何窗口

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

旁注:它真的应该是WM_APP+4;
WM_USER
范围用于窗口类内部的消息。线程消息队列由windows共享,因此您不应向其发布
WM\u USER
消息。

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

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

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

由于
HWND==NULL
没有窗口类,因此它也没有窗口进程,并且消息不会发送到任何窗口

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

旁注:它真的应该是WM_APP+4;
WM_USER
范围用于窗口类内部的消息。线程消息队列由windows共享,因此您不应该向其发布
WM\u USER
消息