Как узнать, когда Windows переходит в / из режима сна или спящего режима?

можно ли подписаться на событие Windows, которое срабатывает, когда Windows входит или выходит из состояния сна или спящего режима?

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

6 ответов


Microsoft.Win32.SystemEvents.PowerModeChanged событие даст вам эту информацию. Это событие доступно во всех вариантах .NET framework, выпущенных Microsoft до сих пор.


в .NET используйте PowerModeChanged событие. В Win32, используйте WM_POWERBROADCAST сообщение.


вы можете контролировать Win32_PowerManagementEvent событие WMI


Не уверен, как часто вы хотите отслеживать это, но если вы пишете службу в .NET, вы можете переопределить ServiceBase, установить CanHandlePowerEvent в true, а затем вы будете уведомлены об изменениях мощности через перечисление PowerBroadcastStatus.


в приложении Visual Studio 2005 C++ MFC вам нужно будет добавить 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, который приостанавливает все настольные приложения и регулирует время работы сторонние Системные службы во время подключенного ожидания. Цель плотина должна поддерживать базовую совместимость программного обеспечения с существующий приложения и службы, но смягчить их влияние на срок службы батареи во время сна.

Windows предотвращает запуск настольных приложений во время любой части подключенный режим ожидания после завершения фазы плотины. Windows позволяет сторонние Системные службы для выполнения в дроссельном режиме после завершение фазы плотины. В этом режиме может работать сторонняя служба не более одной секунды настенных часов каждые 30 считанные секунды.

искусство изящного применения подвески Линн Меррилл от Intel имеет некоторую информацию об обработке различных типов сообщений Windows, связанных с управлением питанием под Windows, однако это дата 2005, поэтому не все материалы могут относиться к Windows после Windows XP. По крайней мере, одно сообщение больше не используется в последовательности сообщений, описанной в этом документе, начиная с Windows Vista PBT_APMQUERYSUSPEND сообщение, которое было раньше запрос на приостановку приложения больше не используется Windows. The теперь используется, чтобы указать, что поток не может быть прерван с изменением режима сна или гибернации. См. ответы в stackoverflow не удается поймать сообщения приостановки сна (winxp) подробнее об управлении питанием сообщения.


вы можете подписаться на NetworkChange.NetworkAvailabilityChanged и NetworkChange.NetworkAddressChanged.

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