.NET 阻止系统睡眠/息屏
本文介绍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 阻止系统睡眠/息屏的更多相关文章
- .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
原文:.NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态 在 Windows 系统中,一段时间不操作键盘和鼠标,屏幕便会关闭,系统会进入睡眠状态.但有些程序(比如游戏.视频和演示文稿)在运行过程中应该 ...
- 阻止系统自动睡眠的小软件,附C#制作过程
原文 http://www.cnblogs.com/h46incon/p/SleepPreventer.html 因为有时下载东西的时候,不想让电脑自动深入睡眠,所以就开启了离开模式.这样不但不节能环 ...
- 阻止系统自动睡眠的小软件,附C#制作过程(执行SetThreadExecutionState API函数,让系统误判)
因为有时下载东西的时候,不想让电脑自动深入睡眠,所以就开启了离开模式.这样不但不节能环保,而且到真正想要睡眠的时候就是一翻蛋疼. 改过自新,关闭了离开模式,同时无操作30分钟后也会进入睡眠模式.但是在 ...
- win10 总是很快自动关机 无人参与系统睡眠超时设置
解决WIN10隔几分钟就自动黑屏睡眠的方法!_Win10之家原文是卸载了电源驱动,下面是在评论里看到的方法: 这是系统无人值守时睡眠时间的设定,默认是两分钟.解决方法:1.运行注册表管理器,win+r ...
- Windows 7下阻止系统关机
从Vista开始,想阻止系统关机就开始变麻烦了,不能只拦截WM_QUERYENDSESSION了,操作系统只给一个应用程序两秒钟的时间去保存自己的东西,两秒钟之后,不管做完了没有,Game Over! ...
- vivox23幻彩版手机怎么设置双击息屏
除了使用电源键来实现快速息屏方式外,我们还能通过双击屏幕的手势来息屏,下面小编就教大家vivox23幻彩版设置双击息屏的方法教程. vivox23幻彩版怎么设置双击息屏 第一步:打开vivox23幻彩 ...
- C#阻止系统休眠
阻止系统休眠 using System.Runtime.InteropServices; static class WinSleepCtr { //定义API函数 [DllImport("k ...
- html5音频audio对象处理以及ios微信端自动播放和息屏后唤醒的判断---可供参考(功能都完整实现了,只是细节还没处理的很好)
// html模版中的 此处结合了weui样式整合的微信手机端片段代码(不可直接粘贴复制进行使用)里面含有一些php的写法,可直接略过..###重点参考js代码### <div> < ...
- h5 移动端 关于监测切换程序到后台或息屏事件和visibilitychange的使用
需求:当我们页面上正在播放视频或者播放背景音乐时,我们屏幕自动息屏或者切换程序去看消息时,我们希望暂停视频或背景音乐,回到程序我们希望继续播放视频或播放背景音乐.小程序上提供了 onUnload返回 ...
- Android 动态注册 亮屏、息屏广播
/***************************************************************************** * Android 动态注册 亮屏.息屏广 ...
随机推荐
- android中的render线程是什么?
在 Android 中,Render 线程(也称为渲染线程)是一个专门用于处理 UI 绘制和动画的线程.它的主要职责是确保用户界面在屏幕上流畅且高效地呈现.这个线程的引入是为了将渲染任务从主线程(UI ...
- Uefi ABL读取XBL设置的标志位
PBL(启动固化程序)-> XBL(扩展引导加载程序,负责初始化芯片驱动和核心应用功能.XBL通常会加载一些平台相关的驱动程序,并提供通用接口)-> ABL(应用引导加载程序,负责引导操作 ...
- Linux-USB驱动笔记-Gadget Function驱动
1.前言 在Linux-USB驱动笔记(四)–USB整体框架中有説到Gadget Function驱动,下面我们来具体看一下. Gadget Function就是指设备的功能,比如作为U盘,需要文件存 ...
- 016 Python 中的基本运算符
#!/usr/bin/env python # -*- coding:utf-8 -*- # Datatime:2022/7/28 15:01 # Filename:016 Python 中的基本运算 ...
- 云原生爱好者周刊:Dapr 成为 CNCF 孵化项目
云原生一周动态要闻: Dapr 加入 CNCF 孵化器 Knative 1.0 发布 Canonical 开始提供针对 Intel CPU 优化的 Ubuntu 图像 Longhorn 为 CNCF ...
- KubeSphere 社区双周报 | 4.8 深圳站 Meetup 火热报名中 | 2023.3.17-3.30
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- Nuxt.js 应用中的 app:resolve 事件钩子详解
title: Nuxt.js 应用中的 app:resolve 事件钩子详解 date: 2024/10/17 updated: 2024/10/17 author: cmdragon excerpt ...
- Ubuntu自动连接到虚拟专用网络
在我们继续之前,我们所做的一个重要假设是,您已经拥有了虚拟专用网络客户端配置文件. 您可以通过以下链接在我们的上一指南中看到一个示例 Open虚拟专用网络 客户端配置文件: 在 CentOS 8/乌本 ...
- [rCore学习笔记 030] 虚拟地址与地址空间
时隔很久,终于忙里偷闲可以搞一搞rCore,上帝啊,保佑我日更吧,我真的很想学会. 导读部分 首先还是要看官方文档. 我决定看一遍然后自己表述一遍(智将). 这里反复提到MMU,就是因为之前学MCU的 ...
- [TAD] Triangles of Absolute Differences-反帕斯卡三角形
[IMO2018] Triangles of Absolute Differences-反帕斯卡三角形 前言 叠甲 笔者不是学数竞的,在此感谢我的数竞生为我讲解题目. 笔者学艺不精,且知识面浅薄. 所 ...