c++ - 如何在 CWinApp 中获取 WM_POWERBROADCAST 消息?

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

我创建了继承 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/

相关文章:

c++ - 为什么 cout 命令不打印消息?

c++ - 从矩阵列中减去特征向量

c++ - MFC CString 中的可变参数和转换运算符

c++ - 我可以禁用菜单栏上的菜单项和/或动态显示它吗?

c++ - 回调的缺陷

c++ - 调试 MFC : "mfc100.dll" cannot find or open pdb

android - 如何在运行时获取 Android 中的电池统计信息?

.net - 如何在 .NET CF 3.5 中获取当前电池电量?

linux - 在 MacOS(或 Linux)的笔记本电脑 sleep 模式期间,如何调查哪个进程会导致唤醒?

c++ - GCC 无法向量化这个简单的循环 ('number of iterations cannot be computed' ) 却在同一代码中管理了一个类似的循环?