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

C#编写Windows服务无法捕获Suspend与ResumeSuspend电源事件

解决Windows服务无法捕获睡眠/唤醒事件的问题
  • 排查系统快速启动设置
    快速启动(Fast Startup)会让Windows进入混合休眠状态,此时睡眠/唤醒不会触发标准的Kernel Power 42(睡眠)、Power-Troubleshooter 1(唤醒)事件,也会导致服务无法捕获Suspend/Resume消息。操作步骤:
    控制面板→电源选项→选择电源按钮的功能→更改当前不可用的设置→取消勾选「启用快速启动(推荐)」,重启系统后测试。

  • 提升服务运行权限
    确保服务以Local System账户运行,该账户拥有接收系统电源广播消息的足够权限。若之前使用其他账户,切换为Local System后重试。

  • 修正OnPowerEvent实现逻辑
    当前代码直接返回基类处理结果,需明确处理所有相关电源事件并返回true表示已处理:

    protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
    {
        EventLog.WriteEntry(SERVICENAME, $"Received Power Event: {powerStatus}", EventLogEntryType.Information);
    
        switch (powerStatus)
        {
            case PowerBroadcastStatus.Suspend:
                EventLog.WriteEntry(SERVICENAME, "设备进入睡眠/休眠状态", EventLogEntryType.Information);
                // 此处添加停止计时器的逻辑
                break;
            case PowerBroadcastStatus.ResumeSuspend:
                EventLog.WriteEntry(SERVICENAME, "设备从睡眠/休眠唤醒", EventLogEntryType.Information);
                // 此处添加启动计时器的逻辑
                break;
            case PowerBroadcastStatus.ResumeAutomatic:
                EventLog.WriteEntry(SERVICENAME, "设备自动唤醒(如定时任务触发)", EventLogEntryType.Information);
                // 处理自动唤醒的逻辑
                break;
            default:
                return base.OnPowerEvent(powerStatus);
        }
    
        return true;
    }
    

    注意:部分系统中睡眠和休眠会共用Suspend事件,需结合业务逻辑区分处理。

  • 检查系统电源计划与组策略

    • 打开电源选项→更改计划设置→更改高级电源设置,确认「睡眠」相关设置未被禁用。
    • 运行gpedit.msc,展开「计算机配置→管理模板→系统→电源管理→睡眠设置」,确保无强制禁用睡眠的策略。
  • 排查硬件驱动问题
    睡眠/唤醒事件依赖硬件驱动支持,若驱动异常会导致系统无法生成对应日志。尝试更新主板、电源相关驱动后,测试睡眠/唤醒是否能在事件查看器中生成Kernel Power 42和Power-Troubleshooter 1日志。

  • 确认SessionChange事件配置
    若需处理登录/锁屏事件,除设置CanHandleSessionChangeEvent = true,还需重写OnSessionChange方法:

    protected override void OnSessionChange(SessionChangeDescription changeDescription)
    {
        base.OnSessionChange(changeDescription);
        EventLog.WriteEntry(SERVICENAME, $"会话变更: {changeDescription.Reason}", EventLogEntryType.Information);
        // 添加登录/锁屏等事件的处理逻辑
    }
    

内容的提问来源于stack exchange,提问作者Kristián Nemček

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:48:13