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