我应该处理WM_ENDSESSION,WM_QUERYENDSESSION,两者还是两者都不?

如果系统试图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 。 如果你想要一个优雅的关闭,你必须在上面的限制内自己构建它。