如何在CWinApp中获取WM_POWERBROADCAST消息?

时间:2013-02-08 04:10:57

标签: c++ mfc power-management visual-c++-2010 windows-messages

我创建了继承CWinApp的类,这个类有一个计时器(使用窗口计时器)。

当PC进入睡眠模式并唤醒时,定时器回调被称为唤醒的准确时间。我希望在PC从暂停状态恢复时不要调用定时器回调。

所以我尝试使用WM_POWERBROADCAST消息。但是这条消息没有在PreTranslateMessage() API中出现。我还使用自己的API尝试了SetWindowLong(),但仍未捕获WM_POWERBROADCAST消息。

有没有办法在WM_POWERBROADCAST中获得CWinApp

2 个答案:

答案 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消息。它会被发送到所有顶级窗口。因此,为了捕获此消息,请在主窗口中创建一个处理程序