3

我正在尝试访问电源管理空闲计数器的“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 (它总是处于最大值...可以理解,因为我正在执行从命令行,但如果我把它放在一个批处理文件中,中间有 sleep.exe,或者放在一个在每次调用 CallNtPowerInformation 之间以“睡眠”进行迭代的程序中,我会得到相同的结果)。

谁能给我一份显示不同 TimeRemaining 和 CurIdle 值的示例代码的副本?

4

1 回答 1

3

有时会发生,我解决了我的问题。这是我为那些遇到相同行为的人学到的东西:

1)我的具体问题是,正如人们可能已经猜到的那样,启动时加载的程序之一以某种方式频繁地重置计数器......所以计数器总是等于最大值。我手动禁用(或卸载)程序,直到 PC 再次挂起。

2)我在上面的问题中建议的构造(在批处理文件中带有 sleep.exe 的简单控制台程序)仍然不起作用。我的猜测是 sleep.exe 或任何执行的批处理文件都将计数器保持在最大值。

3) 我注意到的另一件事(一旦我的测试 PC 正确挂起)是计数器和其他值(MaxIdle 等)仅每 15 秒更新一次。我不知道这是否适用于所有 WinXP 安装,但这有助于解释为什么像我这样正在寻找逐秒倒计时的人无法获得它。(这也解释了为什么我在其他正确挂起的程序上测试我的 CallNtPowerInformation 计时器似乎不起作用......在我每秒重复相同的值之后,我一定在 15 秒过去之前放弃了。)

4)所以...总结一下:a)要非常小心...很多事情会重置空闲计时器 b)不要期望它(或 CurIdle 或 MaxIdleness)更新超过每 15 秒,如果 PC真的空闲(如果不是,计数器立即重置为最大值)。

我希望这可以帮助其他尝试使用此功能的人。

dscottm

于 2010-01-01T15:16:55.213 回答