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

我想知道WM_QUIT,WM_CLOSE和WM_DESTROY消息之间的区别是什么,在Windows程序,本质上:他们什么时候发送,除了什么是由程序定义的任何自动效果?

他们完全不同。

当按下“X”或从窗口菜单中select“closures”时, WM_CLOSE被发送到窗口。 如果你听到这个消息,这是你的电话如何对待它 – 忽略它或真正closures窗口。 默认情况下,传递给DefWindowProc WM_CLOSE会导致窗口被销毁。 当窗口正在销毁WM_DESTROY消息被发送。 在这个阶段,反对WM_CLOSE ,你不能停止这个过程,你只能做一个必要的清理。 但是请记住,当你在所有子窗口被破坏之前捕获WM_DESTROY时。 WM_NCDESTROY在所有的子窗口被销毁之后发送。

WM_QUIT消息与任何窗口无关(从GetMessage获得的hwnd是NULL,并且没有窗口过程被调用)。 此消息指示应停止消息循环并closures应用程序。 当GetMessage读取WM_QUIT它将返回0来指示。 看看典型的消息循环片断 – 循环继续,而GetMessage返回非零。 WM_QUIT可以通过PostQuitMessage函数发送。 当主窗口接收WM_DESTROY时,通常会调用此函数(请参见典型的窗口过程代码段 )。

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

在你的WndProc例程中, DefWindowProc函数负责这些消息的默认行为。 WM_CLOSE消息请求应用程序应该closures,默认行为是调用DestroyWindow函数。 它的这个DestroyWindow函数被调用时发送WM_DESTROY消息。 请注意, WM_CLOSE只是一个请求closures的消息(如WM_QUIT ) – 实际上并不需要退出/退出。 但WM_DESTROY消息告诉你,你的窗口被closures和销毁,所以你必须清理任何资源,处理等

首先让我们来讨论一下WM_QUIT–与另一个与窗口没有关联的消息的区别。 它被应用程序使用。 例如,这可以通过不可见的独立OLE服务器(.exe,但不是以proc作为.dll)

WM_CLOSE – 每msdn:“ 一个应用程序可以提示用户确认,在销毁窗口之前 ” – 它被用作关于意图closures的通知(您可以拒绝这个意图)。

WM_DESTROY – 事实上,窗口正在closures,所有的资源必须(!)被释放。

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

但是,如果你只是简单地键入ESC键,这将导致closures对话框,但是(据我所知),而不产生WM_CLOSE事件 – 它直接到WM_CANCEL/OnCancel()机制。

我现在请社区详细说明这个问题,或者把这个阐述编辑成可接受的答案。