本文介绍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         [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 }

SetThreadExecutionState是WIN32 Winbase下的一个系统函数,给应用程序提供接口:通知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器。详见SetThreadExecutionState 函数 (winbase.h) - Win32 apps | Microsoft Learn

上面还有一个ES_AWAYMODE_REQUIRED未列出来,使用并不多,只能由多媒体应用使用,用于睡眠时执行关键后台处理。

另外,函数执行有返回状态值。如果函数成功,则返回值为上一个线程执行状态。

调用此函数,实现阻止系统睡眠的操作:
 1     /// <summary>
2 /// 阻止系统睡眠/息屏
3 /// </summary>
4 public static EXECUTION_STATE PreventSleep()
5 {
6 return SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_DISPLAY_REQUIRED);
7 }
8
9 /// <summary>
10 /// 允许系统睡眠
11 /// </summary>
12 public static EXECUTION_STATE AllowSleep()
13 {
14 return SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
15 }

这里阻止了睡眠以及息屏的操作

.NET快速查询活动状态

上面是使用.NET在应用中阻止系统进行睡眠以及息屏。.NET还可以通过WIN32直接查询这些阻止请求的总状态,是否可执行睡眠、是否可执行息屏?

CallNtPowerInformation 函数能即时的获取当前系统电源策略状态值,详见 CallNtPowerInformation 函数 (powerbase.h) - Win32 apps | Microsoft Learn

1         [DllImport("Powrprof.dll", CharSet = CharSet.Auto, SetLastError = true)]
2 private static extern uint CallNtPowerInformation(
3 SystemInformationClass information,
4 IntPtr inputBuffer,
5 uint inputBufferLength,
6 IntPtr outputBuffer,
7 uint outputBufferLength
8 );

封装一下,获取系统执行状态:

 1         /// <summary>
2 /// 获取系统执行状态
3 /// 0表示无,可正常睡眠、息屏
4 /// 1表示阻止睡眠中,系统无法睡眠
5 /// 2表示阻止息屏中,系统无法息屏
6 /// 3表示阻止睡眠以及息屏中,系统无法睡眠、息屏
7 /// </summary>
8 /// <returns>返回系统执行状态,如果查询失败,返回<see cref="EXECUTION_STATE.ES_CONTINUOUS"/></returns>
9 public static EXECUTION_STATE GetSystemExecutionState()
10 {
11 IntPtr ptr = Marshal.AllocHGlobal(sizeof(uint));
12 if (CallNtPowerInformation(SystemInformationClass.SystemExecutionState,
13 IntPtr.Zero, 0, ptr, sizeof(uint)) == 0)
14 {
15 var state = Marshal.PtrToStructure(ptr, typeof(uint));
16 switch (state)
17 {
18 case 0: return EXECUTION_STATE.ES_CONTINUOUS;
19 default: return (EXECUTION_STATE)state;
20 }
21 }
22 return EXECUTION_STATE.ES_CONTINUOUS;
23 }

所以获取这个状态,可用于那些即将执行睡眠/息屏的功能,在执行前可确认此操作能否正常执行,提升用户操作的准确性。

.NET 阻止系统睡眠/息屏的更多相关文章

  1. .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态

    原文:.NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态 在 Windows 系统中,一段时间不操作键盘和鼠标,屏幕便会关闭,系统会进入睡眠状态.但有些程序(比如游戏.视频和演示文稿)在运行过程中应该 ...

  2. 阻止系统自动睡眠的小软件,附C#制作过程

    原文 http://www.cnblogs.com/h46incon/p/SleepPreventer.html 因为有时下载东西的时候,不想让电脑自动深入睡眠,所以就开启了离开模式.这样不但不节能环 ...

  3. 阻止系统自动睡眠的小软件,附C#制作过程(执行SetThreadExecutionState API函数,让系统误判)

    因为有时下载东西的时候,不想让电脑自动深入睡眠,所以就开启了离开模式.这样不但不节能环保,而且到真正想要睡眠的时候就是一翻蛋疼. 改过自新,关闭了离开模式,同时无操作30分钟后也会进入睡眠模式.但是在 ...

  4. win10 总是很快自动关机 无人参与系统睡眠超时设置

    解决WIN10隔几分钟就自动黑屏睡眠的方法!_Win10之家原文是卸载了电源驱动,下面是在评论里看到的方法: 这是系统无人值守时睡眠时间的设定,默认是两分钟.解决方法:1.运行注册表管理器,win+r ...

  5. Windows 7下阻止系统关机

    从Vista开始,想阻止系统关机就开始变麻烦了,不能只拦截WM_QUERYENDSESSION了,操作系统只给一个应用程序两秒钟的时间去保存自己的东西,两秒钟之后,不管做完了没有,Game Over! ...

  6. vivox23幻彩版手机怎么设置双击息屏

    除了使用电源键来实现快速息屏方式外,我们还能通过双击屏幕的手势来息屏,下面小编就教大家vivox23幻彩版设置双击息屏的方法教程. vivox23幻彩版怎么设置双击息屏 第一步:打开vivox23幻彩 ...

  7. C#阻止系统休眠

    阻止系统休眠 using System.Runtime.InteropServices; static class WinSleepCtr { //定义API函数 [DllImport("k ...

  8. html5音频audio对象处理以及ios微信端自动播放和息屏后唤醒的判断---可供参考(功能都完整实现了,只是细节还没处理的很好)

    // html模版中的 此处结合了weui样式整合的微信手机端片段代码(不可直接粘贴复制进行使用)里面含有一些php的写法,可直接略过..###重点参考js代码### <div> < ...

  9. h5 移动端 关于监测切换程序到后台或息屏事件和visibilitychange的使用

    需求:当我们页面上正在播放视频或者播放背景音乐时,我们屏幕自动息屏或者切换程序去看消息时,我们希望暂停视频或背景音乐,回到程序我们希望继续播放视频或播放背景音乐.小程序上提供了 onUnload返回 ...

  10. Android 动态注册 亮屏、息屏广播

    /***************************************************************************** * Android 动态注册 亮屏.息屏广 ...

随机推荐

  1. Linux内存管理2.6 -反向映射RMAP(最终版本)

    所谓反向映射是相对于从虚拟地址到物理地址的映射,反向映射是从物理页面到虚拟地址空间VMA的反向映射. RMAP能否实现的基础是通过struct anon_vma.struct anon_vma_cha ...

  2. slot原理

    vue提供组件插槽能力, 允许开发者在封装组件时,把不确定的部分定义为插槽 : 作用:再不确定的内容位置占位,在子组件内使用 slot 标签写占位的内容 : 插槽的分类 : 默认插槽: 具名插槽:使用 ...

  3. 2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动次数从 nums 中拾取 k 个1。 Alice可以选择任何索引 aliceIndex

    2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动次数从 nums 中拾取 k 个1. Alice可以选择任何索引 aliceIndex ...

  4. 你真的理解 Kubernetes 中的 requests 和 limits 吗?

    在 Kubernetes 集群中部署资源的时候,你是否经常遇到以下情形: 经常在 Kubernetes 集群种部署负载的时候不设置 CPU requests 或将 CPU requests 设置得过低 ...

  5. 带你了解nginx功能

    关于Nginx 简介 功能 基本的HTTP服务器功能 其他HTTP服务器功能 邮件代理服务器功能 TCP / UDP代理服务器功能 架构和可扩展性 适用平台 简介 Nginx (engine x) 是 ...

  6. synchronized的四种锁状态

    Java 多线程的锁都是基于对象的,Java 中的每一个对象都可以作为一个锁. 类锁,其实就是 Class 对象的锁. Class 对象是一种特殊的 Java 对象,代表了程序中的类和接口.Java ...

  7. Junit5

    JUnit5 安卓build.gradle https://github.com/mannodermaus/android-junit5 Unit 3 或 JUnit4 的向后兼容性 JUnit4 已 ...

  8. 鸿蒙NEXT开发案例:转盘

    [1]引言(完整代码在最后面) 在鸿蒙NEXT系统中,开发一个有趣且实用的转盘应用不仅可以提升用户体验,还能展示鸿蒙系统的强大功能.本文将详细介绍如何使用鸿蒙NEXT系统开发一个转盘应用,涵盖从组件定 ...

  9. html JavaScript 点击图片放大,点击图片缩小

    参考地址 https://www.jq22.com/webqd7166 可以下载demo 然后对着改 我的是这么用的 前置,先把图片 class 自定义设置 item_img $.fn.ImgZoom ...

  10. Failed to load resoure:the serve responded with a status of 405 (Method Not Allowed)

    在项目中 web.config 引入 iis 删除WEBDEV 配置结束后 重启服务器