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