我有一个带有窗口的小应用程序,它正在侦听 WM_QUERYENDSESSION 消息并返回 FALSE - 这应该告诉 Windows 我不希望它关闭(请参阅此 MSDN 链接)。
我发现即使我要求 Windows 不关闭,并且 Windows 本身也没有关闭,它仍然发送 WM_ENDSESSION 消息并关闭与我自己一起运行的其他应用程序。
有谁知道为什么会发生这种情况以及可以做些什么来使我的应用程序也防止其他应用程序关闭?
我发现我在系统上启动我的应用程序和其他应用程序的顺序会影响哪些是关闭的,哪些不是。
更多研究发现了对SetProcessShutdownParameters()的系统调用。使用此调用,我可以将我的应用程序放在被询问关闭 Windows 的进程列表的前面,从而防止其他应用程序收到 WM_ENDSESSION 消息。
所以总结一下:
当发生关闭事件(关闭、重新启动或注销)时,Windows 会依次向每个应用程序发送 WM_QUERYENDSESSION 消息。
如果应用程序不反对关闭(它们返回 TRUE),则它们会被发送 WM_ENDSESSION 消息。
一旦一个应用程序向 WM_QUERYENDSESSION 返回 FALSE,就会中止关闭,并且不会发送更多消息。
请查看这篇 msdn 文章: http: //msdn.microsoft.com/en-us/library/aa376890 (VS.85).aspx
基本上,这实际上取决于每个应用程序如何处理 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息。如上述文章所述,无论 WM_QUERYENDSESSION 消息的结果如何,都会发送 WM_ENDSESSION 消息。无论结果如何,许多应用程序都决定关闭。
也有许多应用程序在收到 WM_QUERYENDSESSION 后立即启动其关闭过程,以便在可怕的“此应用程序没有响应...”对话框之前有更多时间关闭
希望这能澄清一些事情