我想知道Windows程序中的WM_QUIT,WM_CLOSE和WM_DESTROY消息之间有什么区别,本质上是:它们何时发送,并且除了程序定义的内容外,它们还有其他自动效果吗?
我想知道Windows程序中的WM_QUIT,WM_CLOSE和WM_DESTROY消息之间有什么区别,本质上是:它们何时发送,并且除了程序定义的内容外,它们还有其他自动效果吗?
Answers:
他们是完全不同的。
WM_CLOSE
当关闭窗口时将其发送到窗口-单击其“ X”按钮,或者从窗口菜单中选择“关闭”,或者Alt-F4在窗口具有焦点时按下窗口,等等。如果捕获此消息,则为您决定如何处理它-忽略它,或者真正关闭窗口。默认情况下,WM_CLOSE
传递给DefWindowProc()
导致窗口被销毁。
WM_DESTROY
当它开始被销毁时被发送到窗口。在此阶段,与相对WM_CLOSE
,您无法停止该过程,只能进行任何必要的清除。捕获时WM_DESTROY
,它的所有子窗口都没有被破坏。
WM_NCDESTROY
在完成销毁时将被发送到窗口。到此为止,它的所有子窗口都已被破坏。
WM_QUIT
与任何窗口都不相关(“ hwnd
from”GetMessage()
为NULL,并且不调用任何窗口过程)。此消息表明消息循环应停止并且应用程序应退出。当GetMessage()
读取WM_QUIT
,则返回0,这表示。看一看典型的消息循环代码片段-循环继续,而GetMessage()
返回非零值。
WM_QUIT
可以通过PostQuitMessage()
功能发送。通常在接收主窗口时调用此函数WM_DESTROY
(请参见典型的窗口过程片段)。
WM_ENDSESSION
到达时发生的情况。这会自动触发WM_CLOSE / QUIT / DESTROY吗?
WM_CLOSE
/WM_DESTROY
消息发送给它们。他们有最后的机会通过清理进行清理WM_(QUERY)ENDSESSION
。毕竟,所有赌注都没有了。请参阅当用户注销时Windows不会关闭窗口。那是您的电话
首先,WM_CLOSE和WM_DESTROY消息与特定的窗口相关联,而WM_QUIT消息适用于整个应用程序(井线程),并且永远不会通过窗口过程(WndProc
例程)接收消息,而只能通过GetMessage
或PeekMessage
函数来接收。
在您的WndProc
例程中,该DefWindowProc
函数负责这些消息的默认行为。该WM_CLOSE消息请求,应用程序应该关闭,为此默认behavoir是调用DestroyWindow
函数。当DestroyWindow
调用此函数时,将发送WM_DESTROY消息。注意,WM_CLOSE只是一条消息,要求您关闭(如WM_QUIT)-实际上,您不必退出/退出。但是WM_DESTROY消息告诉你,你的窗口IS关闭和破坏,所以你必须清除任何资源,把手等。