如何读取Windows 10任务管理器中显示的应用耗电量?
读取Windows 10任务管理器应用耗电量的实现方案
你尝试的WMI和性能计数器无法获取对应数据是正常情况,任务管理器展示的应用耗电量依赖Windows内置的能量估算引擎(E3),该数据没有直接暴露在常规的WMI类和性能计数器路径中,可通过以下两种方式实现读取:
方案1:调用powrprof.dll底层接口
- 该接口为任务管理器内部读取功耗数据的原生接口,返回值和任务管理器展示数值完全对齐,需要管理员权限运行
- 核心实现逻辑:
- 加载
powrprof.dll,获取PowerEstimationQuery函数入口 - 传入查询类型
POWER_ESTIMATOR_QUERY_ENERGY_CONSUMPTION执行查询,返回的缓冲区中包含所有进程的累计能耗数据,单位为微瓦时 - 按进程ID匹配进程名,过滤系统进程后即可得到前台应用的耗电量统计
- 加载
- C++ 示例代码片段:
#include <windows.h> #include <powrprof.h> #pragma comment(lib, "powrprof.lib") int main() { ULONG bufSize = 0; // 第一次调用获取所需缓冲区大小 PowerEstimationQuery(POWER_ESTIMATOR_QUERY_ENERGY_CONSUMPTION, NULL, &bufSize, NULL); PVOID buf = malloc(bufSize); // 第二次调用获取实际数据 NTSTATUS status = PowerEstimationQuery(POWER_ESTIMATOR_QUERY_ENERGY_CONSUMPTION, NULL, &bufSize, buf); if (NT_SUCCESS(status)) { auto pInfo = (PPOWER_ENERGY_CONSUMPTION_INFORMATION)buf; for (ULONG i = 0; i < pInfo->EntryCount; i++) { wprintf(L"PID:%lu,累计能耗:%lld μWh\n", pInfo->Entries[i].ProcessId, pInfo->Entries[i].TotalEnergyConsumed); } } free(buf); return 0; }
方案2:解析powercfg命令输出
- 无需调用底层API,适合脚本类快速实现,需要管理员权限运行
- 执行命令
powercfg /batteryreport /output "battery_report.html" /duration 1,生成最近1小时的耗电统计报告 - 直接解析输出的HTML文件,即可提取到所有应用的能耗占比、累计使用时长、耗电量数值
注意事项
- 所有全系统能耗读取操作都需要管理员权限,普通权限仅能读取当前进程本身的能耗数据
- 接口返回的是系统启动以来的累计能耗值,需要两次查询取差值才能得到指定时间段内的耗电数据
- 仅支持现代待机(Modern Standby)的设备会启用完整的能耗统计,老旧设备可能无法返回准确数值

内容的提问来源于stack exchange,提问作者Gerhard Ahrens
相关产品推荐
相关产品推荐

