2013-04-23 4 views
7

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

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

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

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

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

Спасибо.

ответ

1

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

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

0

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

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

+0

Обратите внимание, что я не пытаюсь подключить аппаратное завершение, которое происходит, если вы удерживаете кнопку питания. Я хочу, чтобы выключение событий acpi произошло, когда вы нажимаете кнопку. ОС, безусловно, умеет подключить это событие и отключиться изящно, почему я не могу? – Mark

+0

Mark У вас был какой-то прогресс в этом вопросе? У меня такая же проблема для Windows 7. – RcMan

Смежные вопросы