在Windows程序中WM_QUIT,WM_CLOSE和WM_DESTROY有什么区别?

时间:2010-07-01 07:24:26

标签: c++ windows messages

我想知道Windows程序中WM_QUIT,WM_CLOSE和WM_DESTROY消息之间有什么区别,基本上是:它们何时被发送,除了程序定义之外,它们还有任何自动效果吗?

5 个答案:

答案 0 :(得分:77)

他们完全不同。

当按下“X”或从窗口菜单中选择“关闭”时,

WM_CLOSE被发送到窗口。如果您收到此消息,这是您的电话如何对待它 - 忽略它或真正关闭窗口。默认情况下,传递给WM_CLOSE的{​​{1}}会导致窗口被销毁。当窗口被销毁时,DefWindowProc消息被发送。在这个阶段,与WM_DESTROY相反,你无法阻止这个过程,你只能进行必要的清理。但请记住,当您在所有子窗口都已被销毁之前捕获WM_CLOSE时。在所有子窗口被销毁之后发送WM_DESTROY

WM_NCDESTROY消息与任何窗口无关(从WM_QUIT获取的hwnd为NULL且未调用窗口过程)。此消息表明应停止消息循环并应关闭应用程序。当GetMessage读取GetMessage时,它返回0表示。看一下typical message loop snippet - 循环继续,而WM_QUIT返回非零。 GetMessage可以通过WM_QUIT函数发送PostQuitMessage。当主窗口收到WM_DESTROY时,通常会调用此函数(请参阅typical window procedure snippet)。

答案 1 :(得分:9)

首先,WM_CLOSEWM_DESTROY消息与特定窗口相关联,而WM_QUIT消息适用于整个应用程序(井线程),并且消息永远不会通过窗口过程(WndProc例程),但只能通过GetMessagePeekMessage函数。

WndProc例程中,DefWindowProc函数负责处理这些消息的默认行为。 WM_CLOSE消息请求应用程序关闭,默认行为是调用DestroyWindow函数。在调用此DestroyWindow函数时发送WM_DESTROY消息。请注意,WM_CLOSE只是请求您关闭的消息(如WM_QUIT) - 您实际上不必退出/退出。但WM_DESTROY消息告诉您窗口 IS 正在关闭并销毁,因此您必须清理所有资源,处理等。

答案 2 :(得分:4)

这样就不会在评论中迷失......不要忘记WM_CANCEL。当您单击MFC对话框上的关闭(x)按钮时,它肯定会发送WM_CLOSE。默认的OnClose()函数将调用默认(基类)OnCancel()函数。

但是,如果您只是键入ESC键,这将导致对话框的关闭,但(据我所知),而不会生成WM_CLOSE事件 - 它直接转到WM_CANCEL/OnCancel()机制。

我特此邀请社群详细说明这一点......或将该详细内容编辑成已接受的答案。

答案 3 :(得分:2)

首先让我们讨论WM_QUIT - 与其他与窗口无关的消息的区别。它被应用程序使用。例如,这可以由不可见的独立OLE服务器(.exe,但不是作为.dll的in-proc)处理

WM_CLOSE - 每个msdn:“应用程序可以在销毁窗口之前提示用户进行确认” - 它用作关闭意图的通知(您可以拒绝此意图)。 / p>

WM_DESTROY - 窗口正在关闭,所有资源必须(!)被释放。

答案 4 :(得分:0)

我知道这是旧的,但只是想为任何人提供更清晰的答案。

// What causes each message?
WM_CLOSE:       // Pressed Close Button (X) / Alt+F4 / "Close" in context menu
WM_DESTROY:     // Called DestroyWindow(hwnd)
WM_QUIT:        // Called PostQuitMessage(exit)

// What do they do by default?
case WM_CLOSE: DestroyWindow(hwnd); return 0; // pressed close? destroy window.
case WM_DESTROY: PostQuitMessage(0); return 0; // destroyed window? quit message loop.
// WM_QUIT isn't associated with a window, so isn't sent to the window procedure

所以 WM_CLOSE 只是为了我们可以请求销毁窗口。但是,您可能希望它在您的游戏中显示一个弹出窗口,询问您是否确定。 (如果你想先保存)

并且 WM_DESTROY 实际上默认情况下不会发布退出消息,因为您可以有多个窗口。这只是我们退出后的常见事件。如果需要,您可以让 WM_CLOSE 调用 PostQuitMessage(exit) 并在消息循环后销毁您的窗口。

如果您想在游戏中使用自定义关闭按钮,它应该可以实现 WM_CLOSE 的功能。

还有 CloseWindow(hwnd) 函数,但它只是最小化窗口。

希望对大家有所帮助。