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

62 c++ windows messages

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

adf*_*f88 80

他们是完全不同的.

WM_CLOSE按"X"时发送到窗口或从窗口菜单中选择"关闭".如果您收到此消息,这是您的电话如何对待它 - 忽略它或真正关闭窗口.默认情况下,WM_CLOSE传递给DefWindowProc导致窗口被销毁.当窗口被销毁时,WM_DESTROY将发送消息.在这个阶段,相反WM_CLOSE,你无法阻止这个过程,你只能进行必要的清理.但请记住,当你WM_DESTROY在所有儿童窗户已经被摧毁之前捕获时.WM_NCDESTROY在所有子窗口被销毁之后发送.

WM_QUITmessage与任何窗口无关(hwnd得到的GetMessage是NULL,没有调用窗口过程).此消息表明应停止消息循环并应关闭应用程序.当GetMessage读取WM_QUIT返回0来表示.看一下典型的消息循环片段 - 循环继续,同时GetMessage返回非零.WM_QUIT可以通过PostQuitMessage功能发送.通常在主窗口接收时调用此函数WM_DESTROY(请参阅典型的窗口过程片段).


use*_*297 10

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

在您的WndProc例程中,该DefWindowProc函数负责处理这些消息的默认行为.该WM_CLOSE,应用程序应该关闭,为此默认behavoir消息请求是调用DestroyWindow函数.它在DestroyWindow调用此函数时发送WM_DESTROY消息.请注意,WM_CLOSE只是请求您关闭的消息(如WM_QUIT) - 您实际上不必退出/退出.但是WM_DESTROY消息告诉你,你的窗口IS关闭和破坏,所以你必须清除任何资源,把手等.

  • 不是针对整个应用程序,而是针对特定的消息循环。每个线程可能有自己的消息循环,因此一个应用程序可以有多个消息循环。 (2认同)

oma*_*tai 6

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

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

我在此邀请社群详细阐述这一点......或者将该详细内容编辑成已接受的答案.