我创建了继承CWinApp
的类,这个类有一个计时器(使用窗口计时器)。
当PC进入睡眠模式并唤醒时,定时器回调被称为唤醒的准确时间。我希望在PC从暂停状态恢复时不要调用定时器回调。
所以我尝试使用WM_POWERBROADCAST
消息。但是这条消息没有在PreTranslateMessage()
API中出现。我还使用自己的API尝试了SetWindowLong()
,但仍未捕获WM_POWERBROADCAST
消息。
有没有办法在WM_POWERBROADCAST
中获得CWinApp
?
答案 0 :(得分:1)
在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
变量。请记住返回一个LRESULT
值,表明您是否处理了该消息。
// 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)
{
LRESULT lrProcessed = 0; // indicate if message processed or not
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;
}
// indicate if framework needs to handle message or we did ourselves.
return lrProcessed;
}
有关处理邮件的详细信息,请参阅Microsoft documentation - Power Management以及该文档的特定小节Microsoft documentation - WM_POWERBROADCAST message。
另请参阅SetThreadExecutionState() function,它会影响Windows如何确定应用程序是否处于活动状态以及是否应输入睡眠模式。
另请参阅以下Stack Overflow帖子:
答案 1 :(得分:0)
这是一条Windows消息。它会被发送到所有顶级窗口。因此,为了捕获此消息,请在主窗口中创建一个处理程序