You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C++程序准确估算Windows PC/笔记本电池剩余续航时长

Windows平台C++电池剩余续航估算实现方案(适配VS2017)

一、影响续航估算精度的核心因素

  • 电池基础参数:剩余可用容量、满充容量、电池老化程度(满充容量/设计容量的比值)、实时充放电功率
  • 硬件负载:CPU实时频率与占用率、独立显卡工作状态、屏幕亮度(笔记本屏幕占总功耗20%-40%)、外接USB设备功耗、WiFi/蓝牙发射功率
  • 系统策略:当前电源计划(节能/平衡/高性能)、CPU功耗限制、后台进程唤醒频率、屏幕/硬盘休眠阈值
  • 采样逻辑:Windows原生估算不准的核心原因是采样窗口过短,过度依赖瞬时功率,容易被短时大负载拉偏结果

二、电池充放电速率获取实现(可直接在VS2017编译运行)

所有接口均为Win32原生API,无需引入第三方依赖。

  1. 引入必要头文件与链接库
#include <Windows.h>
#include <PowrProf.h>
#include <ntstatus.h>
#pragma comment(lib, "PowrProf.lib")
  1. 调用CallNtPowerInformation接口读取电池实时状态,该接口返回的SYSTEM_BATTERY_STATE结构直接包含充放电速率字段:
SYSTEM_BATTERY_STATE battStatus;
DWORD res = CallNtPowerInformation(
    SystemBatteryState,
    NULL,
    0,
    &battStatus,
    sizeof(SYSTEM_BATTERY_STATE)
);

if (res == STATUS_SUCCESS) {
    // battStatus.AcOnLine: TRUE表示外接电源已连接
    // battStatus.RemainingCapacity: 当前剩余容量,单位mWh
    // battStatus.FullChargedCapacity: 电池满充容量,单位mWh
    // battStatus.Rate: 充放电速率,单位mW;负值为放电状态,正值为充电状态,0为稳态无充放
    LONG currentDischargeMW = -battStatus.Rate; // 转换为正值的放电功率
}

注意:不要直接使用单次采样的放电功率计算续航。建议开后台线程每5秒采样一次,维护包含最近30个采样点(覆盖2.5分钟时长)的滑动窗口,给越新的采样点分配越高权重,计算加权平均放电率,可大幅降低结果跳变问题。基础续航计算公式为:剩余续航(小时)= 当前剩余容量 / 加权平均放电率。

三、当前屏幕亮度参数获取方法

同样使用原生电源管理接口即可读取,无需额外依赖:

  1. 先获取系统当前激活的电源方案GUID
GUID* activeSchemeGuid = NULL;
PowerGetActiveScheme(NULL, &activeSchemeGuid);
  1. 分别读取外接电源、电池供电两种场景下的亮度设置,返回值为0-100的整数,对应系统亮度滑块的百分比:
DWORD acBrightness = 0; // 接电源时的亮度值
DWORD dcBrightness = 0; // 电池供电时的亮度值
DWORD valSize = sizeof(DWORD);

// 读取外接电源场景亮度
PowerReadACValueIndex(
    NULL,
    activeSchemeGuid,
    &GUID_VIDEO_SUBGROUP,
    &GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS,
    &acBrightness
);

// 读取电池供电场景亮度
PowerReadDCValueIndex(
    NULL,
    activeSchemeGuid,
    &GUID_VIDEO_SUBGROUP,
    &GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS,
    &dcBrightness
);

LocalFree(activeSchemeGuid); // 释放接口返回的GUID指针

如果设备开启了环境光自动亮度调节,需要读取屏幕实时输出亮度,可以额外引入wbemuuid.lib,通过WMI的WmiMonitorBrightness类获取实时值,普通场景下上述接口返回值已经满足计算需求。

四、精度优化建议

  • 异常采样过滤:如果采样到放电率为0,通常是系统刚从休眠唤醒、电源状态切换的过渡状态,这类采样点直接丢弃,不纳入滑动窗口计算;如果单次采样功率超过近期平均功率的3倍,判定为瞬时负载尖峰,降低该点权重
  • 老化补偿:当检测到电池满充容量不足设计容量的60%时,可给估算结果乘以0.85-0.9的修正系数,老化电池在大负载下实际放电效率会低于标称值
  • 自定义校准:不同设备的屏幕功耗差异较大(14寸屏100%亮度比50%亮度功耗高1.5W-3W不等),可以预留简单的校准入口让用户匹配自己的设备参数,进一步提升估算准确度

内容的提问来源于stack exchange,提问作者coolbean4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:24:31