Я создаю класс, который унаследовал CWinApp, и у этого класса есть таймер (используйте таймер окна).
Когда ПК переходит в спящий режим и активируется, обратный вызов таймера называется точным временем активации. Я хочу сделать так, чтобы не вызывать таймер обратного вызова, когда компьютер возобновляет работу из режима ожидания.
Поэтому я попытался использовать сообщение WM_POWERBROADCAST. Но это сообщение не попало в PreTranslateMessage API. Также я попробовал SetWindowLong с моим собственным API, но все еще не перехватил сообщение WM_POWERBROADCAST.
Есть ли способ получить WM_POWERBROADCAST в CWinApp?
Это сообщение Windows. Он отправляется во все окна верхнего уровня. Итак, чтобы поймать это сообщение, создайте обработчик в главном окне
В приложении Visual Studio C ++ MFC вам необходимо добавить ON_MESSAGE () к вашей карте сообщений, ища сообщение WM_POWERBROADCAST, как в этом примере:
BEGIN_MESSAGE_MAP(CFrameworkWndApp, CWinApp)
//{{AFX_MSG_MAP(CFrameworkWndApp)
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 CFrameworkWndApp::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;
}