如果系统正在尝试关闭,则应用可以通过覆盖OnQueryEndSession()并返回来阻止此关闭FALSE。当然,这意味着WM_ENDSESSION是有关关机的唯一明确信息。
另一方面,对这个问题的最高答案不亚于雷蒙德·陈(Raymond Chen)所说的回答,WM_ENDSESSION本质上是毫无意义的。因此,这令人困惑。
在确定执行哪种类型的应用程序关闭工作应该响应的消息(如果有)时,是否存在某种“最佳实践”原则可应用?
特别是,如果未处理任何一条消息,关闭过程是否会导致关闭应用程序,就像用户手动关闭了该应用程序一样(例如,单击红色的X关闭按钮)?
Microsoft的这篇文章对Vista前后的会话结束最佳实践进行了非常全面的讨论。这篇文章很清楚地指出,应该假设如果收到一个消息,WM_QUERYENDSESSION那么在某个时候会发生关机。
一旦所有应用程序响应了该WM_ENDSESSION消息,或被迫在收到WM_ENDSESSION消息后5秒钟内终止,Windows可能随时关闭。这可能会限制可以响应的操作WM_ENDSESSION。
如果应用程序需要更多时间来清理自身,请执行以下操作:
如果您的应用程序可能需要5秒钟以上的时间来完成关闭处理以响应WM_ENDSESSION,则应在其WM_QUERYENDSESSION处理程序中调用ShutdownBlockReasonCreate(),并立即对WM_QUERYENDSESSION响应TRUE,以免阻止关闭。然后,它应该在其WM_ENDSESSION处理程序中执行所有关闭处理。
Windows显然不会向您的应用程序发送任何其他消息,以使其“正常”退出(例如WM_CLOSE)。相反,它将简单地调用TerminateProcess。如果您想要一个优雅的关闭,则必须在上述限制内自行构建。