1

“powercfg -energy”命令如何检测当时运行的每个单独程序的请求计时器分辨率?

我想一种方法是注入到每个正在运行的进程中,并在该进程内部为每个增加的分辨率(值 1-15)在这些分辨率的循环中调用timeEndPeriod ,并检查当前分辨率的timeEndPeriod调用是否返回TIMERR_NOCANDOTIMERR_NOERROR (注意:这些返回值不是对应的。如果它返回TIMERR_NOERROR则断定程序正在使用该频率,然后再次调用timeBeginPeriod. 但是这种方法看起来很麻烦。此外,它有点侵入性,因为它修改了进程的状态,并且还假设 powercfg 能够注入所有进程。

是否有一些记录或未记录的系统 API 可以为外部进程请求该信息?至少我想知道它是如何工作的,即使那个 API 仍然是一个秘密......

一个相关的(但不是主要的)问题是,如果我对单个应用程序的请求不感兴趣,如何获得系统中当前有效的最大计时器分辨率(最小间隔)?我想也许 GetSystemTimeAdjustment() 的 lpTimeIncrement 对此有所帮助,但我不太确定。请确认我或提出替代方法。

4

1 回答 1

3

您可以使用NtQueryTimerResolution().

NTSTATUS NtQueryTimerResolution(OUT PULONGMinimumResolution, 
                                OUT LONGMaximumResolution, 
                                OUT PULONGActualResolution);

有关如何使用它的示例,请参阅这篇文章。但它只会给出任何进程配置的ActualResolution 。它没有给出哪个进程配置了哪个多媒体定时器分辨率的信息。

您不想更改每个进程的多媒体设置来找出哪个进程获得了哪个分辨率。只需要获取有关哪个进程请求了 ActualResolution的信息。

注意:powercfg /energy 仅适用于 Windows 7 / Windows Server 2008 R2 及更高版本。

于 2013-11-28T17:00:42.897 回答