You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模拟笔记本省电模式:调试WM_POWERBROADCAST消息发送失败问题

调试WM_POWERBROADCAST消息发送的实用方法

针对你用BroadcastSystemMessage发送带GUID_POWER_SAVING_STATUS的电源广播消息却收不到的问题,我整理了几个递进的调试步骤,帮你定位问题:


1. 先确认消息发送是否成功

你的代码里已经定义了result变量,一定要检查这个返回值的具体数值:

  • 如果返回BSM_SUCCESS,说明消息已成功发送到目标接收者;
  • 如果返回BSM_NORESPONSE,意味着没有应用响应这个消息;
  • 如果返回BSM_ERROR,那发送过程中直接出错了,可能是参数无效。

可以在代码里加一句输出快速验证:

printf("Broadcast result: %ld\n", result);

根据返回值能快速判断是发送环节还是接收环节出问题。

2. 检查接收端的消息注册逻辑

应用要收到特定的电源设置广播,必须先调用RegisterPowerSettingNotification注册对应的GUID,否则系统不会把GUID_POWER_SAVING_STATUS的消息发给你的窗口。示例注册代码如下:

HDEVNOTIFY hNotify = RegisterPowerSettingNotification(
    hWnd,                  // 你的应用窗口句柄
    &GUID_POWER_SAVING_STATUS,
    DEVICE_NOTIFY_WINDOW_HANDLE
);

另外,窗口过程里要确保正确处理WM_POWERBROADCAST消息:

case WM_POWERBROADCAST:
    if (wParam == PBT_POWERSETTINGCHANGE) {
        POWERBROADCAST_SETTING* pSetting = (POWERBROADCAST_SETTING*)lParam;
        if (IsEqualGUID(pSetting->PowerSetting, GUID_POWER_SAVING_STATUS)) {
            // 处理省电模式状态变化
            printf("Power saving status: %d\n", pSetting->Data[0]);
        }
    }
    return TRUE;

3. 用Spy++监控消息流

Windows自带的Spy++是排查消息问题的神器:

  • 打开Spy++,定位到你的应用窗口;
  • 开启消息监控,过滤WM_POWERBROADCAST消息;
  • 运行你的发送代码,观察Spy++是否捕获到这条消息。

如果Spy能看到消息,但你的窗口过程没处理,那就是接收端代码逻辑问题;如果Spy也看不到,那肯定是发送环节的问题。

4. 验证POWERBROADCAST_SETTING结构的正确性

你初始化的结构:

POWERBROADCAST_SETTING pps = { GUID_POWER_SAVING_STATUS , 1, 1 };

要确认几个细节:

  • GUID_POWER_SAVING_STATUS的正确值为{E00958C0-C213-4ACE-AC77-FECCED2EEEA5},可以核对是否引用正确;
  • DataSize设为1对应单字节的Data,这里1代表省电模式开启、0代表关闭,逻辑是对的;
  • 发送时要确保lParam传递的是该结构的有效指针,内存未被提前释放。

5. 检查权限和会话问题

  • 部分系统广播消息需要管理员权限才能发送,试试以管理员身份运行你的发送程序;
  • 如果是多用户环境,BSM_APPLICATIONS只会发送到当前会话的应用,测试时确保发送和接收程序在同一个用户会话下。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:14:27