"powercfg-energy"命令如何检测当时运行的每个程序请求的计时器分辨率?
我想,一种方法是注入到每个正在运行的进程中,并在该进程内部为这些分辨率上的每个增加的分辨率(值1-15)调用timeEndPeriod,并检查当前分辨率的timeEndPeriod调用是否返回TIMERR_NOCANDO或IMERR_NOERROR(注意:这些返回值不是相应的false和true)。如果返回TIMERR_NOERROR,则断定程序正在使用该频率,然后再次调用timeBeginPeriod。但这种方法似乎很麻烦。此外,它有点侵入性,因为它修改了进程的状态,并且还假设powercfg能够注入到所有进程中。
是否有一些文档化或未文档化的系统API可以为外部流程请求这些信息?至少我想知道它是如何工作的,即使API仍然是个秘密。。。
一个相关的(但不是主要的)问题是,如果我对单个应用程序的请求不感兴趣,如何获得系统中当前有效的最大计时器分辨率(最小间隔)?我想可能GetSystemTimeAdjustment()的lpTimeIncrement有助于实现这一点,但我不太确定。请确认我或提出替代方法。
您可以使用NtQueryTimerResolution()
的未记录的API。
NTSTATUS NtQueryTimerResolution(OUT PULONGMinimumResolution,
OUT LONGMaximumResolution,
OUT PULONGActualResolution);
有关如何使用它的示例,请参阅本文。但它只会给出任何进程配置的实际分辨率。它没有给出哪个进程配置了哪个多媒体定时器分辨率的信息。
你不想改变每个进程的多媒体设置来找出哪个进程获得了哪个分辨率。它只需要获得有关哪个进程请求实际解决的信息。
注意:powercfg/energy仅适用于Windows 7/Windows Server 2008 R2以上版本。