Now that Windows makes it harder for your program to block shutdown, how do you block shutdown?
Up until Windows XP, applications could intercept the
WM_QUERYENDSESSION message and tell Windows, “No, don’t shut down.” If they were polite about it, they would also inform the user which application blocked system shutdown and why. And if they were really polite about it, they would even provide a way for the user to say, “I don’t care; shut down anyway.”
As I noted some time ago, Windows Vista made it harder for applications to block shutdown. Applications are given two seconds to clean up, and then it’s game over.
Okay, now the game of walls and ladders continues. The power management folks created an escape hatch for applications which are doing things like burning a CD or controlling an industrial lathe, where shutting down the machine may not be in the user’s best interest. (The user ends up with a coaster or a factory on fire.) But since they created the escape hatch, they get to control the keys to the hatch, too.
ShutdownBlockReasonCreate function lets you register your application window with a custom message that is displayed to the user when they try to shut down the computer. When the danger-time is over, you call
ShutdownBlockReasonDestroy to say that the coast is clear and shutdown is once again permitted.
Mind you, these blocks are merely advisory. If users really want to create a coaster or burn down their factory, they can click Force shut down. One nice thing about making Windows responsible for the warning message is that if multiple applications want to block shutdown, all of them can be displayed in a single dialog, and the user only needs to click Force shut down once.
Further guidance on system shutdown and the use of these functions can be found in the Application Shutdown Changes in Windows Vista document, which was the source material for most of this blog entry.