c++ - WM_DESTROY消息困惑

标签 c++ windows visual-studio

拥有这样一个简单的 Win 应用程序:

bool continueRunning = true;
...
int APIENTRY wWinMain(...) {
        while (continueRunning) {

            PeekMessage(&msg, 0, 0, 0, PM_REMOVE);

            TranslateMessage(&msg);
            DispatchMessage(&msg);

            if (WM_DESTROY == msg.message) {
                OutputDebugString(L"--- WM_DESTROY (WinMain) ---\n");
            }   
        }
}

...

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

    switch (message) {      

        case WM_DESTROY:
            OutputDebugString(L"--- WM_DESTROY (WndProc) ---\n");
            continueRunning = false;
            break;

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

我收到了 --- WM_DESTROY (WndProc) --- 消息,但没有 --- WM_DESTROY (WinMain) ---

由于 PeekMessage 未收到消息 WM_DESTROY,如何将其传递到应用程序?

最佳答案

PeekMessage(或GetMessage)自行分派(dispatch)发送的消息(从其他线程)而不返回它们。它仅返回已发布的消息。如果消息是由同一线程发送的,则它甚至不通过 PeekMessages,它实际上是直接窗口过程调用。 WM_DESTROY 已发送。

顺便说一下,避免不将系统消息传递给 DefWindowProc,包括 WM_DESTROY

关于c++ - WM_DESTROY消息困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65567088/

相关文章:

c++ - 从抽象类 C++ 继承对象的数组

node.js - 使用app.relaunch后,如何阻止Electron应用重新启动?

c# - 如何在 Windows 窗体中实例化大量按钮?

visual-studio - 为什么不是所有 NUnit 测试类别都显示在测试资源管理器中?

c++ - C/C++ : is it possible to pass binary data through the console?

c++ - 什么是奇怪的重复模板模式 (CRTP)?

c++ - 将文本文件读入矩阵,然后将它们相乘

windows - FuncOne() - 和 FuncTwo() 不工作

vb.net - 使用 vb.net 打开 Excel 文件的保存对话框的提示

c# - 如何在 .net 2.0 目标下禁止 var 关键字?