Windows 在WM_大小处理程序中的PostQuit消息之后没有WM_退出

Windows 在WM_大小处理程序中的PostQuit消息之后没有WM_退出,windows,winapi,Windows,Winapi,我有以下代码片段: 窗口程序: LRESULT window_procedure(HWND window, UINT message_type, WPARAM wparam, LPARAM lparam) { switch (message_type) { case WM_SIZE: { PostQuitMessage(0); return 0; } } return DefWindowProcA(windo

我有以下代码片段:

窗口程序:

LRESULT window_procedure(HWND window, UINT message_type, WPARAM wparam, LPARAM lparam)
{
    switch (message_type)
    {
    case WM_SIZE:
    {
        PostQuitMessage(0);
        return 0;
    }
    }
    return DefWindowProcA(window, message_type, wparam, lparam);
}
事件循环:

while (true)
{
    MSG message;
    while (PeekMessageA(&message, NULL, 0, 0, PM_REMOVE))
    {
        if (message.message == WM_QUIT)
        {
            return message.wParam;
        }
        TranslateMessage(&message);
        DispatchMessageA(&message);
    }
}

我希望每次调整大小时,事件循环都会终止,因为它将收到
WM_QUIT
消息。然而,我似乎不明白这种行为。事件循环仅在我释放调整大小抓取后退出。更奇怪的是,这只是偶尔发生的。有时候,退出的信息似乎没有任何意义

更奇怪的是,这只是偶尔发生的。有时候,退出的信息似乎没有任何意义

您可以打印通过
peek messagea
接收到的所有消息和通过
window\u过程
接收到的消息进行比较,并找到原因

while (true)
{
    MSG message;
    while (PeekMessageA(&message, NULL, 0, 0, PM_REMOVE))
    {
        printf("Message: %x\n", message.message);
        if (message.message == WM_QUIT)
        {
            return message.wParam;
        }
        TranslateMessage(&message);
        DispatchMessageA(&message);
    }
}

测试后,当拖动边框时,
peek消息a
将只接收
WM\u nclubuttondown
WM\u nclubuttonup
消息

正如@Jonathan Potter所说,窗口大小调整运行它自己的模式消息循环。这就是为什么您无法接收在其自己的模式消息循环中处理的
WM_QUIT


如果您在
WM\u nclu buttondown
中调用
PostQuitMessage(0)
,您会发现
PeekMessageA
可以接收
WM\u QUIT

似乎您在收到WM\u size消息时也想退出。或WM_ENTERSIZEMOVE。很难说,这太奇怪了。一定要熟悉像Spy++或WinSpy这样的调试工具。@HansPassant您知道有没有一个好方法可以提前退出调整模式循环的大小?另外,您建议的工具如何帮助调试?窗口大小调整在您按下鼠标按钮时运行自己的模式消息循环,因此在大小调整停止之前,您自己的消息循环不会拾取
WM\u QUIT
。您可以向窗口发送一条
WM_CANCELMODE
消息来取消大小调整循环。@Rui Liu Hi,答案对您有用吗?如果你有任何问题,请随时告诉我。
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    printf("WndProc : %x\n", message);
    ...