首页 > 解决方案 > WM_DESTROY 消息混淆

问题描述

拥有这样一个简单的 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) ---

由于没有收到消息,消息如何WM_DESTROY传递给应用程序?PeekMessage

标签: c++windowsvisual-studio

解决方案


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

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


推荐阅读