Winapi CallNtPowerInformation(SystemPowerInformation…)在WIndows XP上工作吗?

Winapi CallNtPowerInformation(SystemPowerInformation…)在WIndows XP上工作吗?,winapi,suspend,Winapi,Suspend,我正在尝试访问电源管理空闲计数器的“剩余时间”值。谷歌搜索表明,很多人(包括我)可以一次获得一个值,但随后的每一次呼叫都会给出相同的结果。没有倒计时,CurIdle值没有变化 下面是有问题的代码的简短版本: #include <windows.h> #include <tchar.h> #include <powrprof.h> typedef struct _SYSTEM_POWER_INFORMATION { ULONG MaxIdlenessAllo

我正在尝试访问电源管理空闲计数器的“剩余时间”值。谷歌搜索表明,很多人(包括我)可以一次获得一个值,但随后的每一次呼叫都会给出相同的结果。没有倒计时,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;
}
#包括
#包括
#包括
typedef结构\u系统\u电源\u信息{
ULONG Maxidlenesallowed;
乌龙懒散;
剩余时间;
UCHAR冷却模式;
}系统电源信息,*P系统电源信息;
int _tmain(int argc,_TCHAR*argv[]
{
系统动力信息自旋;
CallNtPowerInformation(SystemPowerInformation,NULL,0,&spin,sizeof(SYSTEM\u POWER\u INFORMATION));
_tprintf(_T(“MaxIdleness\T%d\T”),spin.maxidlenessallow;
_tprintf(_T(“CurIdle\T%d\T”),spin.idless;
_tprintf(_T(“TimeRemaining\T%d\n”),spin.TimeRemaining;
返回0;
}
当我从命令行运行它时,我总是得到相同的MaxIdleness(这是预期的)、CurIdle(应该更改)和TimeRemaining值(它总是处于最大值…可以理解,因为我是从命令行执行的,但是如果我将它放在一个批处理文件中,中间有sleep.exe,或者放在一个程序中,该程序在每次调用CallNtPowerInformation之间以“sleep”进行迭代,则会得到相同的结果)


有人能给我一份显示不同剩余时间和CurIdle值的示例代码吗?

正如有时发生的那样,我解决了我的问题。以下是我为遇到相同行为的人所学到的:

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

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

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

4) 因此……总结一下: a) 非常小心…很多事情都会重置空闲计时器 b) 如果电脑确实处于空闲状态(如果不是,计数器会立即重置为最大值),则不要期望它(或CurIdle或Maxidless)每15秒更新一次以上

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

dscottm