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_QUERY­END­SESSION 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."

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.

The
Shutdown­Block­Reason­Create
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
Shutdown­Block­Reason­Destroy
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.