【问题标题】:How to get WM_POWERBROADCAST message in CWinApp?如何在 CWinApp 中获取 WM_POWERBROADCAST 消息?
【发布时间】:2013-02-08 04:10:57
【问题描述】:

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

当 PC 进入睡眠模式并唤醒时,定时器回调称为唤醒的确切时间。当PC从挂起恢复时,我想不调用定时器回调。

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

有什么方法可以在CWinApp 中获取WM_POWERBROADCAST

【问题讨论】:

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


【解决方案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 帖子:

【讨论】:

    【解决方案2】:

    这是一条 Windows 消息。它被发送到所有顶级窗口。因此,为了捕获此消息,请在主窗口中创建一个处理程序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2022-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多