windows - 使用未记录的 CallNtPowerInformation(GetPowerRequestList..) 枚举 Windows "Power Availability Requests"

标签 windows winapi power-management sleep-mode

Windows 7 引入了“电源可用性请求”。此功能允许应用程序通知操作系统它们需要显示器或整个系统,因此应暂时禁止电源管理。该功能记录如下:

https://download.microsoft.com/download/7/E/7/7E7662CF-CBEA-470B-A97E-CE7CE0D98DC2/AvailabilityRequests.docx

可用性请求功能使用对象模型并提供函数 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/

相关文章:

windows - 为什么尾随反斜杠后跟引号在 cmd 中表现如此奇怪?

ios - iOS-如何检测iDevice广告是否已接通电源

.net - Winforms WebBrowser 告诉何时完成刷新

c# - 如何从某个端口上的服务器获取所有可用链接?

c++ - printf 的浮点格式标志 (%f) 仅适用于英文数字格式

winapi - 处理多个windows WIN32 API

android - android广播接收器会消耗电池生命周期吗?

linux - 与 CPU 频率相关的电压水平

Java:WatchService 在复制内容之前得到通知

c++ - PostQuitMessage() 和 DestroyWindow() 之间的逻辑区别是什么?