#c# #windows #usb #standby
#c# #Windows #usb #режим ожидания
Вопрос:
В Windows есть возможность отключения питания определенных периферийных устройств, таких как порты USB, для экономии энергии (это поведение может быть включено / отключено с помощью диспетчера устройств). Отключение питания происходит при различных условиях, например, при закрытии крышки ноутбука. Это вызывает у меня проблему, поскольку у меня есть графический интерфейс, который взаимодействует с оборудованием, подключенным к порту USB, и связь прерывается каждый раз, когда закрывается крышка ноутбука. Есть ли способ программно обнаружить это событие отключения питания (в режиме ожидания?) до того, как оно произойдет, и более корректно завершить работу моего USB-устройства? Есть ли способ программно настроить каждый из системных USB-портов, чтобы отключить это поведение?
Прямо сейчас я смотрю на SystemEvents.PowerModeChanged
, является ли это правильным событием для обнаружения этого?
Ответ №1:
Звучит так, как будто вы хотите
- WM_POWERBROADCAST (http://msdn.microsoft.com/en-us/library/aa373247 (v =против85).aspx)
- Зарегистрируйте уведомление о настройке мощности (http://msdn.microsoft.com/en-us/library/aa373196.aspx )
Сначала вам нужно вызвать RegisterPowerSettingNotification, после чего ваше приложение получит сообщения WM_POWERBROADCAST.
На этой странице представлена реализация класса управления питанием на c #, использующая эти оконные сообщения. http://www.koders.com/csharp/fid00BAA34B0CAA3E320F9F5A44610A015973BF28ED.aspx?s=nativemethods#L175
Комментарии:
1. Как мне получить доступ к этим сообщениям из класса C #, отличного от WinForms?
2. Немного обновили ответ. На самом деле я этого не делал, но я бы предположил, что вы можете подписаться на RegisterPowerSettingNotification из любого класса
3. @LightWing — этот вопрос не имеет никакого отношения к этому, если только вы не ссылаетесь на ссылку, размещенную на ссылку проекта LibUsbDotNet, размещенную в одном из ответов. Есть ли у этого встроенная функциональность для такого рода событий?
Ответ №2:
Как упоминалось в предыдущих постерах, RegisterPowerSettingNotification — это то, что вам нужно. Для уточнения вы можете обратиться к Winforms (System.Windows.Forms.dll ) из других типов .NET-приложений (консоль и т.д.). Вы можете получить доступ к дескриптору окна (для получения сообщений), создав подкласс Winform (класс Forms) и переопределив его WndProc.
В MSDN есть очень хорошая статья о том, как это сделать, наряду с примером кода.