Windows 7 引入了“电源可用性请求”。此功能允许应用程序通知操作系统它们需要显示器或整个系统,因此应暂时禁止电源管理。该功能记录如下:
可用性请求功能使用对象模型并提供函数 PowerCreateRequest()、PowerSetRequest() 和 PowerClearRequest() 来创建请求、激活请求并最终删除请求。此功能与 Windows 2000 中提供的旧版 SetThreadExecutionState() API 非常相似,但允许为每个线程创建多个请求,并通过要求每个请求都有一个原因字符串来改进潜在的诊断。
操作系统提供的 POWERCFG.EXE 实用程序可以使用以下命令枚举当前未完成的请求:
POWERCFG - 请求
Microsoft 没有记录如何使用 Windows API 枚举请求。
SDK 中的 CallNtPowerInformation() 函数已更新,以支持名为“GetPowerRequestList”的新信息级别。这看起来很可能是所需的 API,但没有记录。
请问有人知道如何调用CallNtPowerInformation(GetPowerRequestList..)吗?
吉姆
最佳答案
迟到的答案,但是,我发现调用其他函数更容易(因为 CallNtPowerInformation(GetPowerRequestList, ...)
返回了不支持的错误):
PowerInformationWithPrivileges(GetPowerRequestList, 0, 0, bufout, 16384);
函数签名似乎是相同的,您可能必须定义它和 GetProcAddress
来自powrprof.dll
你自己取决于你有什么可用的库。
输出格式似乎是二进制 blob。如果我不得不猜测,它是一个 int64 列表(即使在 32 位应用程序中),第一个条目是 # 个条目(称为 x),接下来的 x 个条目是实际条目在 blob 中的偏移量,它们本身是某种可变长度 blob/struct,可能与每个 PowerRequest
相关和/或请求类型。不完整的信息,但如果其他人认真尝试让这项工作成功,这应该可以让他们开始。
您需要 admin 来调用此函数(您还需要 admin 来调用 powercfg /requests
,因此这并不奇怪,尽管根据您的用例可能是一个缺点)。
关于windows - 使用未记录的 CallNtPowerInformation(GetPowerRequestList..) 枚举 Windows "Power Availability Requests",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50815246/