在 Windows 系统中,一段时间不操作键盘和鼠标,屏幕便会关闭,系统会进入睡眠状态。但有些程序(比如游戏、视频和演示文稿)在运行过程中应该阻止屏幕关闭,否则屏幕总是关闭,会导致体验会非常糟糕。

本文介绍如何编写 .NET/C# 代码临时阻止屏幕关闭以及系统进入睡眠状态。


本文内容

  • Windows API
  • API 封装

Windows API

我们需要使用到一个 Windows API:

/// <summary>
/// Enables an application to inform the system that it is in use, thereby preventing the system from entering sleep or turning off the display while the application is running.
/// </summary>
[DllImport("kernel32")]
private static extern ExecutionState SetThreadExecutionState(ExecutionState esFlags);

使用到的枚举用 C# 类型定义是:

[Flags]
private enum ExecutionState : uint
{/// <summary>/// Forces the system to be in the working state by resetting the system idle timer./// </summary>SystemRequired = 0x01,/// <summary>/// Forces the display to be on by resetting the display idle timer./// </summary>DisplayRequired = 0x02,/// <summary>/// This value is not supported. If <see cref="UserPresent"/> is combined with other esFlags values, the call will fail and none of the specified states will be set./// </summary>[Obsolete("This value is not supported.")]UserPresent = 0x04,/// <summary>/// Enables away mode. This value must be specified with <see cref="Continuous"/>./// <para />/// Away mode should be used only by media-recording and media-distribution applications that must perform critical background processing on desktop computers while the computer appears to be sleeping./// </summary>AwaymodeRequired = 0x40,/// <summary>/// Informs the system that the state being set should remain in effect until the next call that uses <see cref="Continuous"/> and one of the other state flags is cleared./// </summary>Continuous = 0x80000000,
}

以上所有的注释均照抄自微软的官方 API 文档:

  • SetThreadExecutionState function (winbase.h) - Microsoft Docs

API 封装

如果你擅长阅读英文,那么以上的 API 函数、枚举和注释足够你完成你的任务了。

不过,我这里提供一些封装,以应对一些常用的场景。

using System;
using System.Runtime.InteropServices;namespace Walterlv.Windows
{/// <summary>/// 包含控制屏幕关闭以及系统休眠相关的方法。/// </summary>public static class SystemSleep{/// <summary>/// 设置此线程此时开始一直将处于运行状态,此时计算机不应该进入睡眠状态。/// 此线程退出后,设置将失效。/// 如果需要恢复,请调用 <see cref="RestoreForCurrentThread"/> 方法。/// </summary>/// <param name="keepDisplayOn">/// 表示是否应该同时保持屏幕不关闭。/// 对于游戏、视频和演示相关的任务需要保持屏幕不关闭;而对于后台服务、下载和监控等任务则不需要。/// </param>public static void PreventForCurrentThread(bool keepDisplayOn = true){SetThreadExecutionState(keepDisplayOn? ExecutionState.Continuous | ExecutionState.SystemRequired | ExecutionState.DisplayRequired: ExecutionState.Continuous | ExecutionState.SystemRequired);}/// <summary>/// 恢复此线程的运行状态,操作系统现在可以正常进入睡眠状态和关闭屏幕。/// </summary>public static void RestoreForCurrentThread(){SetThreadExecutionState(ExecutionState.Continuous);}/// <summary>/// 重置系统睡眠或者关闭屏幕的计时器,这样系统睡眠或者屏幕能够继续持续工作设定的超时时间。/// </summary>/// <param name="keepDisplayOn">/// 表示是否应该同时保持屏幕不关闭。/// 对于游戏、视频和演示相关的任务需要保持屏幕不关闭;而对于后台服务、下载和监控等任务则不需要。/// </param>public static void ResetIdle(bool keepDisplayOn = true){SetThreadExecutionState(keepDisplayOn? ExecutionState.SystemRequired | ExecutionState.DisplayRequired: ExecutionState.SystemRequired);}}
}

如果你对这段封装中的 keepDisplayOn 参数,也就是 ExecutionState.DisplayRequired 枚举不了解,看看下图直接就懂了。一个指的是屏幕关闭,一个指的是系统进入睡眠。

此封装后,使用则相当简单:

// 阻止系统睡眠,阻止屏幕关闭。
SystemSleep.PreventForCurrentThread();// 恢复此线程曾经阻止的系统休眠和屏幕关闭。
SystemSleep.RestoreForCurrentThread();

或者:

// 重置系统计时器,临时性阻止系统睡眠和屏幕关闭。
// 此效果类似于手动使用鼠标或键盘控制了一下电脑。
SystemSleep.ResetIdle();

在使用 PreventForCurrentThread 这个 API 的时候,你需要避免程序对空闲时机的控制不好,导致屏幕始终不关闭。

如果你发现无论你设置了多么短的睡眠时间和屏幕关闭时间,屏幕都不会关闭,那就是有某个程序阻止了屏幕关闭,你可以:

  • 查看有哪些程序会一直保持屏幕处于打开状态
  • 找到是谁持续唤醒了计算机屏幕

参考资料

  • SetThreadExecutionState function (winbase.h) - Microsoft Docs

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

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

  1. 三种方法教你开启/关闭win10系统唤醒睡眠模式时需要登录的教程

    Windows系统的睡眠设置给我们带来了极大的方便,因为使用睡眠设置可以保存我们电脑的当前工作状态,再次唤醒睡眠模式时我们可以接着当前的工作状态继续操作,但默认情况下,系统处于安全考虑,当我们从睡眠模 ...

  2. 计算机休眠状态播放音乐,怎么设置win10中关村系统进入睡眠状态后音乐继续播放...

    大家离开电脑一段时间后,ghost windows10系统也会依据网友设置时间自动进入睡眠或待机状态.但是有windows10系统网友反馈进入睡眠状态后播放音乐也会自动停止,需要手动按下键盘或移动鼠标 ...

  3. WIN10系统从睡眠状态唤醒后电脑变卡顿

    设备:hp光影精灵5笔记本 描述:某次电脑从睡眠状态唤醒后就突然变卡顿,连打个字都有延迟,显然不是电脑用久了的那种卡,而是有力使不出的那种卡,似乎叫系统假死,并且伴随蓝屏,重启几次后都没有改善.网上查 ...

  4. 瑞士表商 Swatch 关闭 IT 系统,阻止网络攻击

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 上周末,瑞士表商 Swatch 集团发现了针对其系统的网络攻击活动,随后关闭 IT 系统以阻止. Swatch 集团因生产多姿多彩的手 ...

  5. 阻止计算机系统自动更新,W10电脑系统如何阻止并关闭自动更新

    W10电脑系统如何阻止并关闭自动更新?很多用户升级W10 1709版本之后,发现电脑系统又自动下载一些电脑系统更新了,这让用户很是郁闷,其实想要关闭自动更新很容易,下面请随小编一起操作! W10 17 ...

  6. windows无法连接到user profile service服务。此问题阻止标准用户登录系统

    我用的是win7系统,这两天经常卡,今天早上一开机,就发现系统.及软件所有的配置都恢复了初始状态,并且在右下角弹出一个提示窗口:windows无法连接到user profile service服务.此 ...

  7. 使用 JavaScript 阻止屏幕进入睡眠状态

    使用 JavaScript 阻止屏幕进入睡眠状态 最近在 H5 端有需要保持手机屏幕常亮的需求,辗转之下,发现了一个早在 chrome 85 中就已经支持的 Web API,不过,截止到今天发文时,S ...

  8. WINCE6.0下开始菜单的“挂起(suspend)”是否可见及阻止系统进入睡眠模式

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  9. [html] 如何阻止屏幕旋转时自动调整字体的大小?

    [html] 如何阻止屏幕旋转时自动调整字体的大小? html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 { -webkit-text ...

最新文章

  1. 深度残差网络 - Deep Residual Learning for Image Recognition
  2. LeetCode 1726. 同积元组(排列组合)
  3. 《南溪的目标检测学习笔记》——权重初始化
  4. 更改MAC终端显示的主机名
  5. 怎么修改谷歌浏览器文件提交按钮样式_谷歌浏览器主题美化自定义设置方法
  6. MAC上VMware fusion 12安装vmware tools灰色解决办法
  7. oracle ogg checkpoint,OGG目的端的checkpoint table被drop的修复方法
  8. 在QT界面中使用ico/png等图片文件,生成exe后不依赖外部文件
  9. 2018年迎春杯复赛入围名单(三年级)
  10. ES index 管理
  11. vue3.0组件之父传子,子传父,父传孙
  12. 【汇正财经】大盘低开回升
  13. 7-2 养兔子 (20 分)
  14. 不到30秒接满一壶水,352S100 极速净水器体验
  15. 代码简短且隐蔽的后门木马
  16. mysql8.0怎么样_MySQL8.0初体验
  17. 2022商业版游戏陪玩陪聊系统最新源码+视频教程+全套素材
  18. 【html】屏蔽浏览器自带的输入提示
  19. 快速检查(QuickCheck)(译)
  20. win10 win7比较

热门文章

  1. iPhone通讯录导入及备份方法
  2. 掘金茅台,三位投资客的暴富人生
  3. 亦大亦小如你--MySQL
  4. websphereJDBC提供驱动程序配置问题,导致报错:Illegal attempt to enlist multiple 1PC XAResources
  5. 程序员、架构师、技术经理、技术总监和CTO有啥区别?
  6. HDWiki/插件开发指南
  7. openssl加密解密
  8. 微信图片怎么添加竖排文字_轻松设置微信竖排昵称
  9. 百度云网盘不限速下载之Google Chrome浏览器+SwitchyOmega插件
  10. 腾讯云通过公众号开通短信验证码