我正在尝试访问电源管理空闲计数器的“TimeRemaining”值。谷歌搜索表明很多人(包括我)可以获得一次值,但每次后续调用都会得到相同的结果。没有倒计时,CurIdle值没有变化......
以下是相关代码的简短版本:
#include <windows.h>
#include <tchar.h>
#include <powrprof.h>
typedef struct _SYSTEM_POWER_INFORMATION {
ULONG MaxIdlenessAllowed;
ULONG Idleness;
ULONG TimeRemaining;
UCHAR CoolingMode;
}SYSTEM_POWER_INFORMATION, *PSYSTEM_POWER_INFORMATION;
int _tmain(int argc, _TCHAR* argv[])
{
SYSTEM_POWER_INFORMATION spin;
CallNtPowerInformation(SystemPowerInformation,NULL,0,&spin,sizeof(SYSTEM_POWER_INFORMATION));
_tprintf(_T("MaxIdleness\t%d\t"),spin.MaxIdlenessAllowed);
_tprintf(_T("CurIdle\t%d\t"),spin.Idleness);
_tprintf(_T("TimeRemaining\t%d\n"),spin.TimeRemaining);
return 0;
}
当我从命令行运行它时,我总是得到相同的MaxIdleness值(这是预期的),CurIdle(应该更改)和TimeRemaining(总是处于最大值...因为我可以理解从命令行执行,但如果我将它放在一个批处理文件中,并且在每个CallNtPowerInformation调用之间以“sleep”迭代的程序中放入sleep.exe,我会得到相同的结果。
任何人都可以向我发送一份显示不同TimeRemaining和CurIdle值的示例代码副本吗?
答案 0 :(得分:3)
有时会发生,我解决了我的问题。这是我为那些遇到同样行为的人所学到的:
1)我的具体问题是,正如人们可能已经猜到的那样,启动时加载的程序之一以某种方式频繁地重置计数器......所以计数器总是等于最大值。我手动禁用(或卸载)程序,直到PC再次暂停。
2)我在上面的问题中建议的构造(在批处理文件中使用sleep.exe的简单控制台程序)仍然不起作用。我的猜测是,sleep.exe或任何批处理文件都会使计数器保持最大值。
3)我注意到的另一件事(一旦我的测试PC正常挂起)是计数器和其他值(MaxIdle等)仅每15秒更新一次。我不知道所有WinXP安装是否都是这样,但它有助于解释为什么像我一样的人正在寻找倒数第二倒计时器无法获得它。 (这也解释了为什么我在正确暂停的其他程序上测试我的CallNtPowerInformation计时器似乎不起作用......在我每秒重复相同的值之后,我必须在15秒之前放弃。)
4)所以...总结一下: a)要非常小心......很多事情都会重置空闲计时器 b)如果PC真的空闲(如果不是,则计数器立即重置为最大值),不要指望它(或CurIdle或MaxIdleness)每15秒更新一次。
我希望这有助于其他人尝试使用此功能。
dscottm