PostMessage 不适用于发布自定义消息
PostMessage not working with posting custom message
我用过
PostMessage(NULL,WM_DUCKWND,0,0);
哪里
#define WM_DUCKWND (WM_USER +4)
向当前线程中的所有 windows 发送用户定义的消息。
详情
这是直接在主函数中
(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);
}
但是,断点没有按预期触发。
怎么错了?
"all windows in current thread."
不,那是不正确的。 HWND==NULL
将消息发送到 thread 消息队列。这是您使用 GetMessage(HWND==NULL)
循环处理的消息队列。
DispatchMessage
是查看 msg
中的 HWND
并选择正确的 window 过程的函数。它通过查找该 HWND 的 window class 来实现。
因为 HWND==NULL
没有 window class,所以它也没有 window 过程,并且消息不会发送给任何 window.
如果您想将 WM_DUCKWND(HWND==NULL)
发送给所有 windows,您必须自己发送。在这个简单的例子中,就像为 msg.message==WM_DUCKWND && msg.hWnd==NULL
.
设置 msg.hWnd=hw
一样简单
旁注:确实应该 WM_APP+4
; WM_USER
范围用于 window class 内部的消息。线程消息队列由 windows 共享,所以你不应该 post WM_USER
向它发送消息。
我用过
PostMessage(NULL,WM_DUCKWND,0,0);
哪里
#define WM_DUCKWND (WM_USER +4)
向当前线程中的所有 windows 发送用户定义的消息。
详情
这是直接在主函数中 (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);
}
但是,断点没有按预期触发。
怎么错了?
"all windows in current thread."
不,那是不正确的。 HWND==NULL
将消息发送到 thread 消息队列。这是您使用 GetMessage(HWND==NULL)
循环处理的消息队列。
DispatchMessage
是查看 msg
中的 HWND
并选择正确的 window 过程的函数。它通过查找该 HWND 的 window class 来实现。
因为 HWND==NULL
没有 window class,所以它也没有 window 过程,并且消息不会发送给任何 window.
如果您想将 WM_DUCKWND(HWND==NULL)
发送给所有 windows,您必须自己发送。在这个简单的例子中,就像为 msg.message==WM_DUCKWND && msg.hWnd==NULL
.
msg.hWnd=hw
一样简单
旁注:确实应该 WM_APP+4
; WM_USER
范围用于 window class 内部的消息。线程消息队列由 windows 共享,所以你不应该 post WM_USER
向它发送消息。