本文介绍Windows系统设备下如何阻止系统睡眠/息屏,以及查看当前阻止睡眠/息屏的应用信息

powercfg /requests查看活动列表

在播放音乐时,我们会发现设置了系统电源管理-自动睡眠,计划不会生效,这个音频播放操作阻止了系统自动睡眠。但不会阻止息屏,所以Windows下一般屏幕关闭是不影响音频播放的

通过管理员CMD-powercfg /requests可以查看当前,应用程序和驱动程序电源请求相关列表:

.NET 阻止系统睡眠/息屏-LMLPHP

这里看到是[DRIVER] Synaptics HD Audio,扬声器设备。

powercfg /requests详见 Powercfg 命令行选项 | Microsoft Learn,上面主要几个模式:

  • DIDPLAY 屏幕显示
  • SYSTEM 系统睡眠/休眠。
  • AWAYMODE 离开模式

阻止的可能有DRIVER、SERVICE,也可能是EXE。

比如服务使用阻止睡眠: [SERVICE] \Device\HarddiskVolume3\Program Files\Intel\Intel(R) Ready Mode Technology\IRMTService.exe,这是Intel提供的低功耗模式Intel® Ready Mode 技术 (Intel® RMT),基于这个状态可以在有需要时快速唤醒PC

基于上面几个模式,我们可以解析是哪些应用或者服务在活动、阻止睡眠/息屏。

.NET应用层阻止睡眠/息屏

上面这些阻止操作一般是系统应用实现的。我们开发的应用,也有阻止用户节能操作的场景

比如应用升级,我们想保障升级一次性完成,自动睡眠则会延长整个升级流程、造成不必要的风险。

 1         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 2         private static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
 3         /// <summary>
 4         /// 使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器。
 5         /// 通知应用之后的状态
 6         /// </summary>
 7         [FlagsAttribute]
 8         public enum EXECUTION_STATE : uint
 9         {
10             /// <summary>
11             /// 通知系统正在设置的状态应保持有效,直到使用 ES_CONTINUOUS 的下一次调用和清除其他状态标志之一。
12             /// </summary>
13             ES_CONTINUOUS = 0x80000000,
14             /// <summary>
15             /// 防止显示器关闭
16             /// </summary>
17             ES_DISPLAY_REQUIRED = 0x00000002,
18             /// <summary>
19             /// 防止系统进入睡眠
20             /// </summary>
21             ES_SYSTEM_REQUIRED = 0x00000001
22         }
12-24 15:12