Как я могу перехватить нажатие кнопки физического питания в Windows?

Есть ли способ перехватить событие нажатия физической кнопки питания, чтобы отреагировать на это событие? то есть:

Push button -> My program catches the event -> My program performs action.

Моя цель - написать программу / службу C #, которая будет прослушивать событие кнопки питания, а затем открывать диалоговое окно выключения «Спросите меня, что делать» (как это было во времена Windows XP).


person Xapphire13    schedule 29.01.2013    source источник
comment
возможный дубликат Обнаружение события завершения работы Windows   -  person Jason    schedule 30.01.2013
comment
@ Джейсон: не дубликат. OP спрашивает о перехвате нажатия кнопки питания (чтобы он делал что-то, кроме выключения), тогда как другой вопрос касается обнаружения того, что система выключается.   -  person Harry Johnston    schedule 30.01.2013
comment
comment
Если это не дубликат этих двух, вам нужно сделать что-то вроде этого: sevenforums.com/customization/   -  person DaveShaw    schedule 30.01.2013
comment
Я знаю, что вы можете использовать CallNtPowerInformation с SystemPowerPolicyAc (и / или Dc), чтобы отключить кнопку питания, чтобы она ничего не делала; для этого вам нужно установить PowerButton.Action на PowerActionNone и PowerButton.EventCode на POWER_FORCE_TRIGGER_RESET. Тот же API предоставляет возможность для выполнения программы, но мне непонятно, как ее использовать. Возможно, вам удастся решить это экспериментальным путем, или, возможно, поиск по ключевому слову POWER_LEVEL_USER_NOTIFY_EXEC даст вам некоторые подсказки.   -  person Harry Johnston    schedule 30.01.2013
comment
@DaveShaw: Я тоже не думаю, что это дубликат; этот вопрос хочет знать, как предотвратить принудительное отключение питания пользователем, удерживая кнопку питания нажатой (в отличие от обычного нажатия), что, конечно, невозможно, поскольку такое поведение встроено на аппаратном уровне. То, что здесь хочет OP, по крайней мере, физически возможно, это просто зависит от того, позволяет ли это Windows или нет. :-)   -  person Harry Johnston    schedule 30.01.2013
comment
@DaveShaw: Ссылка, которую вы предоставили, похоже, относится к кнопке питания программного обеспечения в меню «Пуск».   -  person Xapphire13    schedule 30.01.2013
comment
@HarryJohnston: Я исследую то, что вы предложили. Кажется, вы понимаете, что я хочу делать.   -  person Xapphire13    schedule 30.01.2013
comment
Что значит спросить меня, что делать? реальность рушится для вашего приложения, оно должно молиться Нашему отцу ... и проверять вещи ретроспективно, когда оно вернется в онлайн.   -  person G.Y    schedule 31.01.2013
comment
Это диалоговое окно «спросите меня, что делать»: ссылка   -  person Xapphire13    schedule 01.02.2013
comment


Ответы (2)


Вы можете использовать SystemEvents.SessionEnding Event

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

person Alos    schedule 19.02.2013

Я могу объяснить вам это теоретически: кнопка (это кнопка, которая привязана к выключению в большинстве систем) имеет параметр в разделе «Параметры питания», где вы можете указать действие, которое нужно выполнять при нажатии кнопки питания ...

Это то событие ACTION, которое вы ищете, привязанное к кнопке окнами, ТОГДА создающее событие выключения. Есть программы, которые анализируют и отслеживают переменные и вызовы Windows, вам придется использовать одну из них, чтобы выяснить это и перехватить / переопределить.

person RandomUs1r    schedule 19.02.2013