是否关闭不发送WM_QUIT消息的应用程序



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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow) {
...
HWND hwnd = CreateWindowEx(0, CLASS_NAME, L"Learn to Program Windows", WS_POPUP | WS_BORDER, 0, 0, 190, 110, nHwnd, NULL, hInstance, NULL);
if (hwnd != NULL) {
ShowWindow(hwnd, nCmdShow);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_QUIT)                 {
swprintf_s(msgbuf, _T("WM_QUIT (main)n"));
OutputDebugString(msgbuf);
}
}
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_DESTROY:
swprintf_s(msgbuf, _T("WM_DESTROYn"));
OutputDebugString(msgbuf);
PostQuitMessage(0);
return 0;
case WM_CLOSE:
swprintf_s(msgbuf, _T("WM_CLOSEn"));
OutputDebugString(msgbuf);
DestroyWindow(hwnd);
return 0;
case WM_QUIT:
swprintf_s(msgbuf, _T("WM_QUITn"));
OutputDebugString(msgbuf);
return 0;
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
Example_DrawImage9(hdc);
EndPaint(hwnd, &ps);
return 0;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

当我执行Alt+F4关闭它时,我得到WM_close、WM_DESTROY,但不是WM_QUIT?为什么我没有收到WM_QUIT消息?

在https://learn.microsoft.com/en-us/windows/win32/winmsg/wm-quit:

WM_QUIT消息与窗口无关,因此将永远不要通过窗口的窗口过程接收。已检索仅通过GetMessage或PeekMessage函数。

不要使用PostMessage功能发布WM_QUIT消息;使用PostQuitMessage。

===在接受回答以进行进一步澄清后添加的部分===

正如其他人所指出的,在提交的原始代码中有两件事。在消息映射中,有一个WM_QUIT的切换用例条目。我引用的文档显示,该消息不适用于windows,因此永远不会处理case语句。

然而,还有另一个问题正在发生。看看消息泵:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_QUIT)                 {
swprintf_s(msgbuf, _T("WM_QUIT (main)n"));
OutputDebugString(msgbuf);
}
}

当调用GetMessage()并且WM_QUIT消息是在队列中检索到的消息时,GetMessage()的返回值将为零,因此它将立即退出while循环。

此文档记录在https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessage

如果函数检索到WM_QUIT以外的消息,则返回值为非零。

如果函数检索WM_QUIT消息,则返回值为零

最新更新