Как я могу узнать, когда Windows переходит в / из спящего режима или в режим гибернации? - PullRequest
21 голосов
/ 23 октября 2008

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

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

Ответы [ 6 ]

20 голосов
/ 23 октября 2008
Событие

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

6 голосов
/ 23 октября 2008

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

3 голосов
/ 24 июня 2015

В приложении 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-портов больше не действительны после возобновления. Я также не уверен насчет интерфейсов с другими процессами, например, соединениями с базой данных.

В дополнение к стандартным состояниям управления питанием в спящем и спящем режимах Microsoft представила состояние питания Connected Standby с Windows 8 и 8.1 , которое имеет некоторые конструктивные последствия в зависимости от типа приложения.

Настольные приложения обычно не требуют дополнительной работы для интеграции с подключенный режим ожидания.

Desktop Activity Moderator (DAM) - это компонент Windows, который приостанавливает все настольные приложения и ограничивает время выполнения сторонние системные сервисы во время подключения в режиме ожидания. Цель DAM должен поддерживать базовую совместимость программного обеспечения с существующими приложения и услуги, но смягчают их влияние на срок службы батареи во время сна.

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

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

3 голосов
/ 23 октября 2008

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

3 голосов
/ 23 октября 2008

Вы можете отслеживать Win32_PowerManagementEvent Событие WMI

0 голосов
/ 31 октября 2017

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

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

...