前言

昨晚开着电脑听歌的时候,突然发现过了两个小时还不会熄屏,这就奇了怪了,因为我的电脑是设置了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.

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

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

方法二、事件跟踪器

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

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

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

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

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

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

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

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

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

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