Windows 系统上如何揪出阻止你屏幕关闭的程序

使用 Win32 API SetThreadExecutionState 可以阻止进入屏幕保护程序,也能阻止屏幕关闭、阻止系统睡眠。这很方便,这也就可能造成各种参差不齐的程序都试图阻止你的屏幕关闭,于是来一个一整晚亮瞎眼就很难受。

本文教大家如何揪出阻止你屏幕关闭的程序。


我们主要使用系统自带的 powercfg 来查询相关的应用。因此,你需要以管理员权限打开你喜欢的终端。

命令 powercfg /requests

在终端中输入命令:

powercfg /requests

/requests 参数的作用是‎“列举应用程序和驱动程序的电源请求。电源请求可防止计算机自动关闭显示屏或进入低功耗睡眠模式。‎”官方文档对此的描述是:

Enumerates application and driver Power Requests. Power Requests prevent the computer from automatically powering off the display or entering a low-power sleep mode.

于是,如果有某个应用或驱动设置了阻止屏幕关闭,那么就会出现在此命令执行的结果里面。

比如下面是我的例子:

发现 SteamVR 的电源请求

结束掉 SteamVR 后重新执行此命令,可以发现已经没有进程在阻止屏幕关闭和系统睡眠了:

没有程序在阻止屏幕关闭

命令 powercfg -energy -trace

在终端中输入命令:

powercfg -energy -trace

有时,应用并没有直接阻止你的屏幕关闭,而是在一段时间之内试图不断重置睡眠计时器,这种情况,前面的命令不能完全帮助你找到问题所在,于是你需要使用这个新命令。

运行这个命令,你需要等待 60 秒,就像下面这样:

注意等待期间不要碰电脑,因为鼠标和键盘事件也会影响到追踪结果!

运行 60 秒的追踪

等待完成后,它会提示你“跟踪完成”,但不会直接告诉你任何结果。结果都存在了你个账户目录下的 energy-trace.etl 日志文件里面,例如 C:\Users\lvyi\energy-trace.etl

这个文件要用事件查看器打开。

第一步:右键开始按钮,选择“事件查看器”。

打开事件查看器

第二步:操作→打开保存的日志

去用户文件夹中寻找“energy-trace.etl”文件,例如“C:\Users\lvyi\energy-trace.etl”,然后打开。

打开保存的日志

第三步:在保存的日志中找到可疑记录

由于日志太多(几十万条),建议右击日志选择“筛选当前日志(L)…”,在筛选器里将事件来源选成“Kernel-Power”,事件 ID 设为 63。

设置筛选器

可以看到,即便我设置完成,也还有 7,852 个条目。不过这时也比较容易找到问题在哪里了。提示的是:

The application or service 0x0 is attempting to update the system timer resolution to a value of 0x0.

即有程序试图重置系统计时器。

点击其中的几条查阅

在详细信息里,可以找到是哪个程序:

msedge 正在重置系统计时器

可以看到,在这条记录里,是“msedge.exe”。所以,可以去 Edge 浏览器标签里找找,是否有正在播放的视频或音频等。

常用阻止关闭屏幕的程序

发现电脑屏幕总是不自动关闭?看看你是否打开了这些程序……


参考资料

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/detect-which-process-is-keeping-your-screen-on-in-windows.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,或者前往 CSDN 关注我的主页

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