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