我创建了继承 CWinApp
的类,并且这个类有一个计时器(使用窗口计时器)。
当 PC 进入休眠模式并唤醒时,定时器回调调用精确的唤醒时间。我想在 PC 从挂起状态恢复时不调用计时器回调。
所以我尝试使用WM_POWERBROADCAST
消息。但此消息未在 PreTranslateMessage()
API 中捕获。我还用我自己的 API 尝试了 SetWindowLong()
,但仍然没有捕捉到 WM_POWERBROADCAST
消息。
有没有办法在 CWinApp
中获取 WM_POWERBROADCAST
?
最佳答案
在 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 帖子:
关于c++ - 如何在 CWinApp 中获取 WM_POWERBROADCAST 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14765534/