1

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

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

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

有什么办法进去WM_POWERBROADCASTCWinApp

4

2 回答 2

2

在 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 文档 - 电源管理以及该文档的特定小节Microsoft 文档 - WM_POWERBROADCAST消息。

另请参阅影响 Windows 如何确定应用程序是否处于活动状态以及是否应进入睡眠模式的SetThreadExecutionState() 函数。

另请参阅以下 Stack Overflow 帖子:

于 2015-06-25T00:48:35.797 回答
0

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

于 2013-02-08T04:35:18.630 回答