Winapi powercfg-energy如何检测请求的计时器分辨率

Winapi powercfg-energy如何检测请求的计时器分辨率,winapi,timer,system-information,powercfg,Winapi,Timer,System Information,Powercfg,“powercfg-energy”命令如何检测当时运行的每个程序所请求的计时器分辨率 我设想一种方法是注入每个正在运行的进程,并在该进程内为每个提高的分辨率(值1-15)调用timeEndPeriod在这些分辨率上循环,并检查当前分辨率的timeEndPeriod调用是否返回TIMERR\u NOCANDO或TIMERR\u NOERROR(注意:这些返回值不是相应的false和true)。如果它返回TIMERR\u NOERROR,则断定程序正在使用该频率,然后再次调用timeBeginPer

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

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

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


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

您可以使用
NtQueryTimeResolution()
的未记录API

有关如何使用它的示例,请参见。但它只会给出任何流程配置的实际解决方案。它不提供哪个进程配置了哪个多媒体计时器分辨率的信息

您不希望更改每个进程的媒体设置以找出哪个进程获得了哪个分辨率。只需获取有关哪个流程请求实际解决的信息即可

注意:powercfg/energy仅在Windows 7/Windows Server 2008 R2及以上版本中提供

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