【发布时间】:2021-01-04 17:30:55
【问题描述】:
拥有这么简单的 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 传递给应用程序?
【问题讨论】:
-
WM_DESTROY是 sent 并直接进入窗口 proc。请参阅docs 中的第一段。 -
好的,但是由于没有
PeekMessage- 窗口进程中的类似功能,应用程序如何获取这样的消息? -
WM_DESTROY永远不会进入消息队列。它是一个发送的消息,直接传递给window proc。 -
但我的代码中没有明确的
SendMessage调用。当我单击“X”按钮时,它只是由系统隐式/默认/自动发送吗? -
它是由 Windows “当窗口被销毁时”发送的,引用自相同的文档。在Why can't I get a WM_DESTROY or WM_CLOSE message outside a window procedure? 和WndProc calling mechanism (WinAPI) 上查看更多信息。
标签: c++ windows visual-studio