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

我想知道Windows程序中WM_QUIT,WM_CLOSE和WM_DESTROY消息之间的区别是什么:本质上:它们何时发送,并且除了程序定义的内容外,它们还会有其他自动效果吗?

asked 2019-10-09T10:07:54Z
4个解决方案
77 votes

他们是完全不同的。

当按下“ X”或从窗口菜单中选择“关闭”时,将WM_CLOSE发送到窗口。 如果您收到此消息,这就是您如何处理它的电话-忽略它或真正关闭窗口。 默认情况下,传递给hwndWM_QUIT导致窗口被破坏。 销毁窗口时,将发送GetMessage消息。 在此阶段,与GetMessage相反,您无法停止该过程,只能进行必要的清除。 但是请记住,当您在所有子窗口均已销毁之前捕获WM_QUIT时。 在所有子窗口都已销毁之后立即发送GetMessage

WM_QUIT消息与任何窗口都不相关(从GetMessage获取的hwnd为NULL,并且未调用任何窗口过程)。 此消息指示应停止消息循环并应关闭应用程序。 当GetMessage读取WM_QUIT时,它返回0表示。 看一下典型的消息循环代码片段-循环继续,而GetMessage返回非零。 WM_QUIT可以通过PostQuitMessage函数发送。 通常在主窗口收到WM_DESTROY时调用此函数(请参见典型的窗口过程代码段)。

adf88 answered 2019-10-09T10:08:21Z
9 votes

首先,WM_CLOSE和WM_DESTROY消息与特定窗口相关联,而WM_QUIT消息适用于整个应用程序(井线程),并且永远不会通过窗口过程(WndProc例程)接收到该消息,而只能通过DefWindowProcDestroyWindow接收到该消息。 职能。

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

user353297 answered 2019-10-09T10:08:56Z
4 votes

只是为了确保它不会在注释中丢失...不要忘了ESC。单击MFC对话框上的关闭(x)按钮时,它肯定会发送WM_CLOSE。默认的WM_CANCEL/OnCancel()函数将调用默认的 (基类)OnCancel()函数。

但是,如果仅键入ESC键,则会导致对话框关闭,但是(据我所知)却没有生成WM_CLOSE事件-它直接进入WM_CANCEL/OnCancel()机制。

我在此邀请社区对此进行详细说明...或将该详细说明编辑为已接受的答案。

omatai answered 2019-10-09T10:09:37Z
2 votes

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

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

WM_DESTROY-这是窗口正在关闭并且必须释放所有资源的事实。

Dewfy answered 2019-10-09T10:10:18Z
translate from https://stackoverflow.com:/questions/3155782/what-is-the-difference-between-wm-quit-wm-close-and-wm-destroy-in-a-windows-pr