使用 Win32 API SetThreadExecutionState
可以阻止进入屏幕保护程序,也能阻止屏幕关闭、阻止系统睡眠。这很方便,这也就可能造成各种参差不齐的程序都试图阻止你的屏幕关闭,于是来一个一整晚亮瞎眼就很难受。
本文教大家如何揪出阻止你屏幕关闭的程序。
我们主要使用系统自带的 powercfg
来查询相关的应用。因此,你需要以管理员权限打开你喜欢的终端。
命令 powercfg /requests
在终端中输入命令:
1 | 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
在终端中输入命令:
1 | powercfg -energy -trace |
---|
有时,应用并没有直接阻止你的屏幕关闭,而是在一段时间之内试图不断重置睡眠计时器,这种情况,前面的命令不能完全帮助你找到问题所在,于是你需要使用这个新命令。
运行这个命令,你需要等待 60 秒,就像下面这样:
注意:等待期间不要碰电脑,因为鼠标和键盘事件也会影响到追踪结果!
等待完成后,它会提示你“跟踪完成”,但不会直接告诉你任何结果。结果都存在了你个账户目录下的 energy-trace.etl
日志文件里面,例如 C:Userslvyienergy-trace.etl
。
这个文件要用事件查看器打开。
第一步:右键开始按钮,选择“事件查看器”。
第二步:操作→打开保存的日志
去用户文件夹中寻找“energy-trace.etl”文件,例如“C:Userslvyienergy-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.exe”。所以,可以去 Edge 浏览器标签里找找,是否有正在播放的视频或音频等。
常用阻止关闭屏幕的程序
发现电脑屏幕总是不自动关闭?看看你是否打开了这些程序……
参考资料
- Powercfg command-line options - Microsoft Docs
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/detect-which-process-is-keeping-your-screen-on-in-windows.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。