.NET 阻止系统睡眠/息屏

news/2025/3/9 22:51:11/文章来源:https://www.cnblogs.com/kybs0/p/18624932

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857637.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python网络编程之http longpull

服务端:from flask import Flask, request, jsonify import timeapp = Flask(__name__)@app.route(/stream, methods=[GET]) def poll():# 假设这里有一个方法来检查是否有新数据# 为了示例,我们简单地模拟等待数据time.sleep(5) # 模拟处理时间或等待数据# 假设这是从某处获…

Python中指数概率分布函数的绘图详解

在数据科学和统计学中,指数分布是一种应用广泛的连续概率分布,通常用于建模独立随机事件发生的时间间隔。通过Python,我们可以方便地计算和绘制指数分布的概率密度函数(PDF)。本文将详细介绍指数分布的原理、应用场景,并提供详细的代码示例,展示如何在Python中绘制指数分…

VScode + cmake编写Qt程序

本机环境 Ubuntu 20.04 Qt 5.12.81. 安装Vscode直接在官网下载对应的deb包安装即 可。下载后在deb包所在目录执行如下命令安装deb包。sudo dpkg -i 安装包名.deb然后在应用程序中应该就有了Vscode的图标了。2. 安装cmake与gcc g++先安装cmakesudo apt-get install cmake然后安装…

RK3588开发板入门教程

一、EVM-RK3588 评估板外观二、常用系统信息查看1、查看系统内核版本信息,使用uname命令:$unamet-a2、查看操作系统信息:$ cat /etc/issue3、查看系统内存使用情况:$free-h4、查看系统磁盘使用情况:$ df -h5、查看磁盘和分区:# 查看所有分区 $ fdisk -l # 查看文件可看到…

【教程】第十章:任务仪表盘(2) —— 各有千秋

通过循序渐进的功能升级,你将打造一个强大的管理系统,让团队协作更高效、流程更智能。在本章中,我们将带您一步步完成任务仪表盘的下一部分,有任何疑问记得随时来论坛咨询。 从复习上章内容开始,让我们一起展开这段探索之旅吧! 10.1 揭晓上一章节答案 10.1.1 状态与链接 …

Llama 3.2 900亿参数视觉多模态大模型本地部署及案例展示

本文介绍了如何在本地部署Llama 3.2 90B(900亿参数)视觉多模态大模型,并开发一些Use Case,展示其强大的视觉理解能力。Llama 3.2 900亿参数视觉多模态大模型本地部署及案例展示 本文将介绍如何在本地部署Llama 3.2 90B(900亿参数)视觉多模态大模型,并开发一些Use Case,…

【新教程】Ubuntu server 24.04配置无线网WiFi

0 相关信息 Ubuntu Server 24.04 1 工具准备 sudo apt install network-manager wpasupplicant wireless-tools2 过程 查看无线网卡名称: ip addr一般wl开头的为无线网卡。比如,我这里的无线网卡就是wlo1 扫描无线网络: sudo iwlist wlo1 scan | grep ESSID # 注意将 wlan0…

BOE(京东方)亮相世界显示产业创新发展大会 以创新科技全面引领行业风向标

2024年12月19日,世界显示产业创新发展大会在成都举办,来自全球的显示领域企业及行业专家汇聚一堂,共同探讨新一轮产业升级趋势及行业未来发展方向。BOE(京东方)总裁高文宝博士应邀出席大会,并在开幕式发表《屏之物联 聚智创新》主题演讲,引发现场嘉宾和观众强烈共鸣。大…

BOE(京东方)“向新2025”年终媒体智享会落地成都 持续创新引领产业步入高价值增长新纪元

12月20日,BOE(京东方)“向新 2025”年终媒体智享会的脚步从上海延伸至成都。川渝之地,作为 BOE(京东方)产业生态战略布局中的关键一子,此刻再度成为行业瞩目的焦点。本次活动全面回溯了BOE(京东方)在2024年多个关键领域斩获的斐然佳绩,深入剖析了六大维度构建的“向新…

BOE(京东方)绿色低碳显示生态交流会成功举办 共筑行业绿色未来

2024年12月19日,世界显示产业创新发展大会在成都盛大召开,众多行业专家及产业链伙伴齐聚一堂,共同探讨显示产业科技创新成果与未来发展方向。作为全球半导体显示行业龙头企业,BOE(京东方)在大会同期举办了主题为“物联视界,碳索未来”的绿色低碳显示生态交流会,携手上下…

聊一下新电脑-macbook air 15寸 m2 16+512g

购买于转转二手商城 售价: 6250 配置:16+512g m2芯片 15寸 已经过保了,激活日期是去年的12月,差不多刚好一年电池健康:100%算是保养得很好的了!磁盘读写也不多:整体橙色95新以上! 我使用时间机器去换机的,整个过程十分的流畅! 除了换完之后开机有点卡顿,不知道是网络还是什么原…

小学数学思维训练 一年级 第一周(少儿思维启蒙)

前言 本文主要介绍了通过各种题型和解题方法培养孩子的数学思维能力。通过系统的方法训练一年级学生的数学思维能力,帮助他们学会举一反三,融会贯通地解决各类数学问题。 点击获取小学数学1-6年级思维训练电子版 第一周 比一比 比一比是实际生活中常见的一类数学问题,需要同…