如果系统试图closures,应用程序可以通过覆盖OnQueryEndSession()
并返回FALSE
来阻止closures。 当然,这意味着WM_ENDSESSION
是关于关机的唯一明确信息。
另一方面, 这个问题的最高层回答不亚于Raymond Chen说,回应WM_ENDSESSION
是毫无意义的。 所以这是令人困惑的。
是否有某种“最佳实践”原则可用于决定哪些消息(如果有)应该做出什么样的应用closures工作?
特别是,如果两个消息都没有被处理,closures过程是否会导致应用程序被closures,就好像用户手动closures了应用程序(例如,点击红色的Xclosuresbutton)?
微软的这篇文章对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
。 如果你想要一个优雅的关闭,你必须在上面的限制内自己构建它。