Ответ 1
Microsoft.Win32.SystemEvents.PowerModeChanged
событие предоставит вам эту информацию. Это событие доступно во всех вариантах платформы .NET, выпущенных Microsoft до сих пор.
Возможно ли подписаться на событие Windows, которое запускается, когда Windows входит или выходит из состояния сна или спящего режима?
Мне нужно, чтобы мое приложение стало известно, когда компьютер собирается спать, чтобы выполнить некоторую очистку и избежать проблем с синхронизацией, когда он выходит из сна.
Microsoft.Win32.SystemEvents.PowerModeChanged
событие предоставит вам эту информацию. Это событие доступно во всех вариантах платформы .NET, выпущенных Microsoft до сих пор.
В .NET используйте событие PowerModeChanged. В Win32 используйте сообщение WM_POWERBROADCAST.
Вы можете отслеживать Win32_PowerManagementEvent Событие WMI
Не знаете, как часто вы хотите отслеживать это, но если вы пишете службу в .NET, вы можете переопределить ServiceBase, установить CanHandlePowerEvent в true, а затем вы будете уведомлены об изменениях мощности через перечисление PowerBroadcastStatus.
В приложении Visual С++ MFC для Visual Studio 2005 вам нужно добавить ON_MESSAGE()
на карту сообщений, ищущую сообщение WM_POWERBROADCAST
, как в этом примере:
BEGIN_MESSAGE_MAP(CFrameworkWndDoc, CWindowDocument)
//{{AFX_MSG_MAP(CFrameworkWndDoc)
ON_WM_CHAR()
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_POWERBROADCAST, OnPowerMsgRcvd)
END_MESSAGE_MAP()
Затем вам нужно будет добавить функцию обработчика сообщений вместе с изменением определения класса, чтобы объявить функцию-член для обработчика сообщений, чтобы вы могли проверить переменную wParam
для типа сообщения, как в этом скелете:
// Handle the WM_POWERBROADCAST message to process a message concerning power management
// such as going to Sleep or Waking Up.
LRESULT CFrameworkWndDoc::OnPowerMsgRcvd(WPARAM wParam, LPARAM lParam)
{
switch (wParam) {
case PBT_APMPOWERSTATUSCHANGE:
TRACE0("PBT_APMPOWERSTATUSCHANGE received\n");
break;
case PBT_APMRESUMEAUTOMATIC:
TRACE0("PBT_APMRESUMEAUTOMATIC received\n");
break;
case PBT_APMRESUMESUSPEND:
TRACE0("PBT_APMRESUMESUSPEND received\n");
break;
case PBT_APMSUSPEND:
TRACE0("PBT_APMSUSPEND received\n");
break;
}
return 0;
}
То, что я видел, это тест с использованием вышеприведенного в приложении, запущенном в Windows 7, который запускается в отладчике, а затем я вручную заставляю свой компьютер запускать приложение в режим сна. Я увижу следующее сообщение:
PBT_APMSUSPEND received
Затем, когда ПК перезагружается и я регистрирую, что я увижу в окне вывода отладчика, два сообщения одно за другим:
PBT_APMRESUMESUSPEND received
PBT_APMRESUMEAUTOMATIC received
Все, что я нашел до сих пор, указывает на то, что у вас нет указания, выходите ли вы из состояния сна или состояния спящего режима. Я все еще делаю дальнейшие исследования в отношении того, что нужно делать при приостановке или возобновлении до тех пор, пока файлы и устройства не будут обрабатываться. Я видел признаки того, что дескрипторы файлов для COM-портов больше не действуют после возобновления. Я также не уверен в интерфейсах к другим процессам, например, к соединениям с базой данных.
В дополнение к стандартным состояниям управления питанием Sleep и Hibernate Microsoft представила состояние подключенного резервного питания в Windows 8 и 8.1, в котором есть некоторые в зависимости от типа приложения.
Настольные приложения обычно не требуют дополнительной работы для интеграции с подключенного режима ожидания.
Модератор активности рабочего стола (DAM) - это компонент Windows, который приостанавливает работу всех настольных приложений и снижает время выполнения сторонних системных служб во время ожидания подключения. Цель DAM - поддерживать базовую совместимость программного обеспечения с существующими приложений и услуг, но уменьшают их влияние на срок службы батареи во время сна.
Windows предотвращает запуск настольных приложений во время любой части подключенного режима ожидания после завершения фазы DAM. Windows позволяет сторонние системные службы для выполнения в дроссельном режиме после завершение фазы DAM. В этом режиме может выполняться сторонняя служба не более одной секунды от настенных часов каждые 30 секунд.
Увлечение изящной приостановки приложения Lynn Merrill от Intel имеет некоторую информацию об обработке различных типов сообщений Windows, связанных с управлением питанием под Windows однако это дата 2005, поэтому не все материалы могут относиться к Windows после Windows XP. В последовательности сообщений, описанной в этом документе, по крайней мере одно сообщение больше не используется, так как начиная с Windows Vista сообщение PBT_APMQUERYSUSPEND
, которое использовалось для запроса того, может ли приложение приостанавливаться, больше не используется Windows. Функция SetThreadExecutionState()
теперь используется, чтобы указать, что нить не может быть прервана с изменением состояния Sleep или Hibernate. См. Ответы в stackoverflow Не удается поймать сообщения о приостановке сна (winxp) для получения более подробной информации об изменениях состояния состояния управления питанием.
Вы можете подписаться на NetworkChange.NetworkAvailabilityChanged и NetworkChange.NetworkAddressChanged.
Обычно я запускаю двухсекундный таймер, чтобы я мог возобновить сетевые коммуникации после того, как он находится в спящем режиме, когда он истечет.
Не удалось найти какого-либо официального решения на сегодняшний день. В моем случае достаточно было обнаружить SessionSwitch по причинам блокировки/разблокировки:
SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
...
private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
switch (e.Reason)
{
case SessionSwitchReason.SessionLock:
// Going into lock/standby screen
break;
case SessionSwitchReason.SessionUnlock:
// Back from lock/standby
break;
default:
break;
}
}