.NET 制止系统睡眠/息屏

打印 上一主题 下一主题

主题 771|帖子 771|积分 2313

本文介绍Windows系统设备下怎样制止系统睡眠/息屏,以及查看当前制止睡眠/息屏的应用信息
powercfg /requests查看活动列表

在播放音乐时,我们会发现设置了系统电源管理-自动睡眠,计划不会生效,这个音频播放操作制止了系统自动睡眠。但不会制止息屏,以是Windows下一样平常屏幕关闭是不影响音频播放的
通过管理员CMD-powercfg /requests可以查看当前,应用步伐和驱动步伐电源请求相关列表:

这里看到是[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. 1         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  2. 2         private static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
  3. 3         /// <summary>
  4. 4         /// 使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器。
  5. 5         /// 通知应用之后的状态
  6. 6         /// </summary>
  7. 7         [FlagsAttribute]
  8. 8         public enum EXECUTION_STATE : uint
  9. 9         {
  10. 10             /// <summary>
  11. 11             /// 通知系统正在设置的状态应保持有效,直到使用 ES_CONTINUOUS 的下一次调用和清除其他状态标志之一。
  12. 12             /// </summary>
  13. 13             ES_CONTINUOUS = 0x80000000,
  14. 14             /// <summary>
  15. 15             /// 防止显示器关闭
  16. 16             /// </summary>
  17. 17             ES_DISPLAY_REQUIRED = 0x00000002,
  18. 18             /// <summary>
  19. 19             /// 防止系统进入睡眠
  20. 20             /// </summary>
  21. 21             ES_SYSTEM_REQUIRED = 0x00000001
  22. 22         }
复制代码
SetThreadExecutionState是WIN32 Winbase下的一个系统函数,给应用步伐提供接口:通知系统它正在使用中,从而防止系统在应用步伐运行时进入睡眠状态或关闭显示器。详见SetThreadExecutionState 函数 (winbase.h) - Win32 apps | Microsoft Learn
上面还有一个ES_AWAYMODE_REQUIRED未列出来,使用并不多,只能由多媒体应用使用,用于睡眠时执行关键后台处理。
另外,函数执行有返回状态值。如果函数成功,则返回值为上一个线程执行状态。
调用此函数,实现制止系统睡眠的操作:
  1. 1     /// <summary>
  2. 2     /// 阻止系统睡眠/息屏
  3. 3     /// </summary>
  4. 4     public static EXECUTION_STATE PreventSleep()
  5. 5     {
  6. 6         return SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_DISPLAY_REQUIRED);
  7. 7     }
  8. 8
  9. 9     /// <summary>
  10. 10     /// 允许系统睡眠
  11. 11     /// </summary>
  12. 12     public static EXECUTION_STATE AllowSleep()
  13. 13     {
  14. 14         return SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
  15. 15     }
复制代码
这里制止了睡眠以及息屏的操作
.NET快速查询活动状态

上面是使用.NET在应用中制止系统举行睡眠以及息屏。.NET还可以通过WIN32直接查询这些制止请求的总状态,是否可执行睡眠、是否可执行息屏?
CallNtPowerInformation 函数能即时的获取当前系统电源策略状态值,详见 CallNtPowerInformation 函数 (powerbase.h) - Win32 apps | Microsoft Learn
  1. 1         [DllImport("Powrprof.dll", CharSet = CharSet.Auto, SetLastError = true)]
  2. 2         private static extern uint CallNtPowerInformation(
  3. 3             SystemInformationClass information,
  4. 4             IntPtr inputBuffer,
  5. 5             uint inputBufferLength,
  6. 6             IntPtr outputBuffer,
  7. 7             uint outputBufferLength
  8. 8         );
复制代码
封装一下,获取系统执行状态:
  1. 1     /// <summary>
  2. 2     /// 获取系统执行状态
  3. 3     /// 0表示无,可正常睡眠、息屏
  4. 4     /// 1表示阻止睡眠中,系统无法睡眠
  5. 5     /// 2表示阻止息屏中,系统无法息屏
  6. 6     /// 3表示阻止睡眠以及息屏中,系统无法睡眠、息屏
  7. 7     /// </summary>
  8. 8     /// <returns>返回系统执行状态,如果查询失败,返回<see cref="EXECUTION_STATE.ES_CONTINUOUS"/></returns>
  9. 9     public static EXECUTION_STATE GetSystemExecutionState()
  10. 10     {
  11. 11         IntPtr ptr = Marshal.AllocHGlobal(sizeof(uint));
  12. 12         if (CallNtPowerInformation(SystemInformationClass.SystemExecutionState,
  13. 13                 IntPtr.Zero, 0, ptr, sizeof(uint)) == 0)
  14. 14         {
  15. 15             var objectState = Marshal.PtrToStructure(ptr, typeof(uint));
  16. 16             var stringState = objectState?.ToString();
  17. 17             if (stringState != "0" && Enum.TryParse(stringState, out EXECUTION_STATE state))
  18. 18             {
  19. 19                 return state;
  20. 20             }
  21. 21         }
  22. 22         return EXECUTION_STATE.ES_CONTINUOUS;
  23. 23     }
复制代码
以是获取这个状态,可用于那些即将执行睡眠/息屏的功能,在执行前可确认此操作可否正常执行,提升用户操作的准确性。
出处:http://www.cnblogs.com/kybs0/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表