前言

昨晚开着电脑听歌的时候,突然发现过了两个小时还不会熄屏,这就奇了怪了,因为我的电脑是设置了 3 分钟熄屏的。

而 Win32API Winbase.h 里面的 SetThreadExecutionState 可以使得屏幕关闭和阻止系统休眠,而这本身是静默的,Windows 并没有在前端提示是由谁造成的,于是就特别难蚌(

折腾了一圈也是发现有两种方式可以把阻止休眠的程序找出来。

方法一、命令行方式

在管理员终端中,使用命令powercfg /requests

requests 参数的作用是‎“列举应用程序和驱动程序的电源请求。电源 API 可防止计算机自动关闭显示屏或进入低功耗睡眠模式。

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

于是乎,如果有某个程序或者驱动设置了屏幕关闭或者禁止休眠,就会在下面显示。

PixPin_2024-05-20_00-56-26.png

6,我这里是 QQ 音乐导致的,按照常理来说,这种音乐类软件组织休眠是正常的,但不应该阻止熄屏啊……

方法二、事件跟踪器

有的软件他的实现方式比较鸡贼?或者说比较不遵守规范?抑或是方法比较暴力。总之,他们不是用正常的 API 方法实现不熄屏,而是用不停的重置睡眠计时器的方式去实现的,那么,他既然不是调用SetThreadExecutionState,那么方法一的指令自然没办法找到他们,那么就要用事件跟踪器去找。

还是管理员终端,输入powercfg -energy -trace

用了这个命令之后要等 60 秒,而且不要碰电脑,不然鼠标键盘操作也会被记录进去,就会多了一些“没用”的东西。

出现跟踪完成之后呢,就完事了。

要注意!他生成的内容在你当前终端路径之下,比如我现在是 C"\Users\AGEN233 那么文件在这个路径下,如果你是 管理员: 命令提示符 那么就是在对应的 C:\Windows\System32

Clip_2024-05-20_01-28-57.png

然后我们打开 事件查看器,Win + R,输入eventvwr

然后顶部菜单栏,操作 → 导入自定义视图 选择刚刚导出来的文件。

Clip_2024-05-20_01-38-21-1716140314674-6.png

但是打开之后会发现日志太多了,很麻烦

选中 energy-trace 右键 筛选当前日志,事件来源Kernel-Power,ID 是63

Clip_2024-05-20_01-38-21-1716140314674-6.png

然后你要找 The application or service 0x0 is attempting to update the system timer resolution to a value of 0x0. 点击详细之后可以看到是那个程序。