Предотвратить завершение работы Windows с помощью специального сообщения - PullRequest
15 голосов
/ 24 сентября 2011

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

VMWare prevents Windows shutdown with a custom message

Обычно мы видим сообщение «Эта программа не позволяет завершить работу Windows» вместо новой «1 Виртуальная машина используется».

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

1 Ответ

11 голосов
/ 24 сентября 2011

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

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

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

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

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

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

...