Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

Не удалось найти какого-либо официального решения на сегодняшний день. В моем случае достаточно было обнаружить 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;
        }
    }