Как управлять выключением нажатия кнопки питания?

Я работаю над приложением в стиле киоска, где мне нужно управлять выключением / перезапуском ПК при нажатии кнопки питания. Благодаря этому сообщению я прошел примерно 90% пути.

  1. На панели управления установите действие нажатия кнопки питания acpi для выключения.
  2. Прослушайте сообщение WndProc WM_QUERYENDSESSION
  3. При получении выдают полностью недокументированные:

    [DllImport("user32.dll", SetLastError = true)]
    static extern int CancelShutdown();
    
  4. Вернитесь из WndProc и вызовите мое собственное окно сообщения с просьбой к пользователю выключить / перезапустить или отменить и ответить на их действие.

Все работает хорошо, если я запускаю / завершаю работу с панели задач (я могу выдавать тезисы так быстро, как хочу). Все тоже хорошо работает при первом нажатии на кнопку включения. При последующих нажатиях кнопки питания я вижу задержку в минуту или около того, прежде чем я получаю сообщение WM_QUERYENDSESSION.

Есть ли параметр или запись в реестре о том, как часто Windows будет выдавать событие ACPI? Я знаю, что дело не в оборудовании, потому что под Linux та же машина будет запускать событие ACPI так быстро, как я могу нажать кнопку.

Спасибо.


person Mark    schedule 23.04.2013    source источник


Ответы (2)


Позвонив мне на работе, я смог задать этот вопрос напрямую в службу поддержки Microsoft. Что касается моего третьего инженера службы поддержки, мне, по сути, сказали, что это невозможно на уровне приложения. Он считал, что вызов недокументированного CancelShutdown() «сбивает с толку» диспетчер питания или драйвер acpi, что приводит к задержке сообщения WM_QUERYENDSESSION. Поскольку CancelShutdown() недокументирован, MS не желает проводить дальнейшее расследование.

Итак, как вы фиксируете нажатие кнопки питания? Вам необходимо написать драйвер устройства, в частности Драйвер фильтра ACPI. Мы сейчас расследуем это.

person Mark    schedule 17.05.2013

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

В Windows 8.1 (возможно) появится режим киоска. Может быть, это то, что вы ищете ;-)

person juFo    schedule 01.05.2013
comment
Обратите внимание, что я не пытаюсь перехватить аппаратное отключение, которое происходит при удерживании кнопки питания. Я хочу, чтобы отключение события acpi происходило при нажатии кнопки. ОС определенно способна перехватить это событие и корректно завершить работу, почему я не могу? - person Mark; 02.05.2013
comment
Марк, есть ли у вас прогресс по этому вопросу? У меня такая же проблема со встроенной Windows 7. - person RcMan; 19.04.2016