问题
If a system is trying to shut down, an app can block this shutdown by overriding OnQueryEndSession()
and returning FALSE
. Surely that means WM_ENDSESSION
is the only definitive message to respond to regarding shutdown.
On the other hand, the top answer to this question quotes no less than Raymond Chen as saying that responding to WM_ENDSESSION
is essentially pointless. So this is confusing.
Is there some kind of "best practice" principles to apply in deciding which of these messages (if any) one should respond to for doing what kinds of application shutdown work?
In particular, if neither message is handled, will a shutdown process cause an application to be closed as if the user had closed the application manually (e.g. click on red X close button)?
回答1:
This article from Microsoft gives a very comprehensive discussion of end-of-session best practice both pre- and post-Vista. The article makes it quite clear that one should assume that if one receives a WM_QUERYENDSESSION
then shutdown will occur at some point.
As soon as all applications have responded to the WM_ENDSESSION
message, or been forced to terminate within 5 seconds of receiving the WM_ENDSESSION
message, Windows may shut down at any time. This may limit what can be done in response to WM_ENDSESSION
.
If an application requires more time to clean itself up:
If your application may need more than 5 seconds to complete its shutdown processing in response to WM_ENDSESSION, it should call ShutdownBlockReasonCreate() in its WM_QUERYENDSESSION handler, and promptly respond TRUE to WM_QUERYENDSESSION so as not to block shutdown. It should then perform all shutdown processing in its WM_ENDSESSION handler.
Windows will apparently not send any additional messages to your application to allow it to exit "gracefully" (e.g. WM_CLOSE). Rather, it will simply call TerminateProcess
. If you want a graceful close, you have to build it yourself within the above constraints.
来源:https://stackoverflow.com/questions/31374339/should-i-process-wm-endsession-wm-queryendsession-both-or-neither