Определение состояния питания USB

#c# #windows #usb #standby

#c# #Windows #usb #режим ожидания

Вопрос:

В Windows есть возможность отключения питания определенных периферийных устройств, таких как порты USB, для экономии энергии (это поведение может быть включено / отключено с помощью диспетчера устройств). Отключение питания происходит при различных условиях, например, при закрытии крышки ноутбука. Это вызывает у меня проблему, поскольку у меня есть графический интерфейс, который взаимодействует с оборудованием, подключенным к порту USB, и связь прерывается каждый раз, когда закрывается крышка ноутбука. Есть ли способ программно обнаружить это событие отключения питания (в режиме ожидания?) до того, как оно произойдет, и более корректно завершить работу моего USB-устройства? Есть ли способ программно настроить каждый из системных USB-портов, чтобы отключить это поведение?

Прямо сейчас я смотрю на SystemEvents.PowerModeChanged , является ли это правильным событием для обнаружения этого?

Ответ №1:

Звучит так, как будто вы хотите

  1. WM_POWERBROADCAST (http://msdn.microsoft.com/en-us/library/aa373247 (v =против85).aspx)
  2. Зарегистрируйте уведомление о настройке мощности (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 есть очень хорошая статья о том, как это сделать, наряду с примером кода.