winapi - CallNtPowerInformation(SystemPowerInfomation...) 是否适用于 WIndows XP?

标签 winapi suspend

我正在尝试访问电源管理空闲计数器的“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.exe 进行迭代,或者将它放在一个程序中,我会得到相同的结果。

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

最佳答案

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

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

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

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

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

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

dscottm

关于winapi - CallNtPowerInformation(SystemPowerInfomation...) 是否适用于 WIndows XP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1976215/

相关文章:

c++ - 无法将char数组写入Windows注册表项

android - 在普通函数中调用挂起函数

winapi - 我如何接受 MathML?

CRITICAL_SECTION 没有 DebugInfo

android - 如何在 Android 设备上启用磁盘挂起?

f# - 暂停和恢复 F# 异步工作流程 (Async<'T>)

android - 如何从 google play 开发者控制台中删除暂停的应用程序?

kotlin - 如何在不阻塞调用函数的情况下从另一个挂起函数调用挂起函数?

.NET:如何在特定线程上调用委托(delegate)? (ISynchronizeInvoke、Dispatcher、AsyncOperation、SynchronizationContext 等)

c++ - CreateNamedPipe 导致 ERROR_ACCESS_DENIED?