Предотвращение выключения Windows с помощью настраиваемого сообщения

Рабочая станция VMWare делает что-то довольно крутое, когда я пытаюсь выключить Windows во время работы виртуальной машины:

VMWare prevents Windows shutdown with a custom message

Как правило, мы увидим сообщение "Эта программа предотвращает Windows от выключения" вместо новой "1 виртуальной машины".

Как VMWare делает это? Я не смог найти какие-либо API-интерфейсы об этом в Google.

Ответы

Ответ 1

Вы можете прочитать все об изменениях, внесенных в Vista здесь. Вы действительно должны внимательно прочитать эту статью.

API, который вы ищете, ShutdownBlockReasonCreate, ShutdownBlockReasonDestroy и ShutdownBlockReasonQuery. Помните, что эти API доступны только на сервере Vista/2008. Вам нужно будет реализовать поведение отскока на 2000/XP.

Если вам нужно заблокировать выключение, вы вызываете ShutdownBlockReasonCreate, передавая дескриптор в основное окно, и причину в виде строки. Эта строка - это то, что отображается в диалоговом окне блокировки выключения, то есть "1 виртуальная машина используется" на снимке экрана.

Если операция блокировки завершения завершается, вы вызываете ShutdownBlockReasonDestroy.

Обратите внимание, что вы все равно должны использовать WM_QUERYENDSESSION, чтобы все части соответствовали друг другу. Это часть, которая фактически блокирует выключение.

В XP вы также должны ответить WM_ENDSESSION, и если ваше приложение заблокировало выключение, вежливо показать сообщение о том, почему. Если вы этого не сделаете, пользователь останется царапать его/ее голову относительно того, почему компьютер игнорирует инструкцию для выключения.