PostMessage()成功,但我的消息处理代码从未接收到消息



在我的C++应用程序的GUI对象中,我在主窗口过程中有以下内容:

case WM_SIZE:
    {
        OutputDebugString(L"WM_SIZE received.n");
        RECT rect = {0};
        GetWindowRect(hwnd, &rect);
        if (!PostMessage(0, GUI_MSG_SIZECHANGED, w, MAKELONG(rect.bottom - rect.top, rect.right - rect.left))) {
            OutputDebugString(L"PostMessage failed.n"); // <--- never called
        }
    }
    return 0; // break;

GUI对象还有以下getMessage()方法:

int GUI::getMessage(MSG & msg) {
    BOOL result = 0;
    while ((result = GetMessage(&msg, 0, 0, 0)) > 0) {
        if (msg.message > (GUI_MSG_BASE-1) && msg.message < (GUI_MSG_LAST+1)) {
            OutputDebugString(L"GUI message received.n");
            break;
        }
        else {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return result;
}

应用程序对象以以下方式调用此方法:

while ((result = _gui.getMessage(msg)) > 0) {
    switch (msg.message) {
        // TODO: Add gui message handlers
        case GUI_MSG_SIZECHANGED:
            OutputDebugString(L"GUI_MSG_SIZECHANGED received.n");
            _cfg.setWndWidth(HIWORD(msg.lParam));
            _cfg.setWndHeight(LOWORD(msg.lParam));
            if (msg.wParam == SIZE_MAXIMIZED)
                _cfg.setWndShow(SW_MAXIMIZE);
            else if (msg.wParam == SIZE_MINIMIZED)
                _cfg.setWndShow(SW_MINIMIZE);
            else if (msg.wParam == SIZE_RESTORED)
                _cfg.setWndShow(SW_SHOWNORMAL);
            break;
    }
}

应用程序对象对窗口大小感兴趣,因为它将这些信息存储在配置文件中。

当我在VisualStudio的调试器中运行此程序时,调整窗口大小后,输出窗口如下所示:

WM_SIZE received.
GUI message received.
GUI_MSG_SIZECHANGED received.
WM_SIZE received.
WM_SIZE received.
WM_SIZE received.
WM_SIZE received.
...etc...

PostMessage()函数从未失败,但似乎只在第一次处理WM_SIZE时发送GUI_MSG_SIZECHANGED(#定义为WM_APP+0x00d),也就是在处理WM_CREATE之后。

我不知道是什么原因造成的。我尝试使用SendMessage和PostThreadMessage,但结果是一样的。还阅读了MSDN的消息处理文档,但找不到我的代码有什么问题。

有人能帮忙吗?

破解一个自定义消息循环总有一天你会后悔的。你打得早。

不要发布带有NULL窗口句柄的消息,只有当你能保证你的程序只启动你的自定义消息循环时,它们才能工作。你不能做出这样的保证。一旦您启动对话框或Windows决定自行启动消息循环,这些消息就会落入位桶中。当用户调整窗口大小时,调整大小的逻辑是模态的。Windows启动自己的消息循环,WM_ENTERSIZEMOVE宣布它。这也是PostThreadMessage是邪恶的原因,如果线程能够显示任何窗口。即使是MessageBox也是致命的。DispatchMessage无法传递消息。

创建一个用作控制器的隐藏窗口。现在,您可以在其窗口过程中检测到GUI_MSG_SIZECHANGED,并且无需对消息循环进行破解。该控制器经常是应用程序的主窗口。

相关内容

  • 没有找到相关文章

最新更新