Ответ 1
Вы можете прочитать все об изменениях, внесенных в Vista здесь. Вы действительно должны внимательно прочитать эту статью.
API, который вы ищете, ShutdownBlockReasonCreate
, ShutdownBlockReasonDestroy
и ShutdownBlockReasonQuery
. Помните, что эти API доступны только на сервере Vista/2008. Вам нужно будет реализовать поведение отскока на 2000/XP.
Если вам нужно заблокировать выключение, вы вызываете ShutdownBlockReasonCreate
, передавая дескриптор в основное окно, и причину в виде строки. Эта строка - это то, что отображается в диалоговом окне блокировки выключения, то есть "1 виртуальная машина используется" на снимке экрана.
Если операция блокировки завершения завершается, вы вызываете ShutdownBlockReasonDestroy
.
Обратите внимание, что вы все равно должны использовать WM_QUERYENDSESSION
, чтобы все части соответствовали друг другу. Это часть, которая фактически блокирует выключение.
В XP вы также должны ответить WM_ENDSESSION
, и если ваше приложение заблокировало выключение, вежливо показать сообщение о том, почему. Если вы этого не сделаете, пользователь останется царапать его/ее голову относительно того, почему компьютер игнорирует инструкцию для выключения.