gpt4 book ai didi

c++ - PostMessage 不适用于发布自定义消息

转载 作者:太空宇宙 更新时间:2023-11-04 06:45:34 26 4
gpt4 key购买 nike

我用过

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

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

怎么错了?

最佳答案

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

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

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

因为 HWND==NULL 没有窗口类,所以它也没有窗口过程,并且消息不会被分派(dispatch)到任何窗口。

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

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

关于c++ - PostMessage 不适用于发布自定义消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58320306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com