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

WINAPI C++中BATTERY_STATUS结构体初始化及电池电压获取咨询

BATTERY_STATUS初始化与WINAPI获取电池电压方案

一、BATTERY_STATUS结构体的初始化方法

Windows API中未明确文档化的结构体初始化遵循通用规则:声明后先清零内存,避免残留垃圾数据导致API调用异常。常用两种方式:

  • 直接用初始化列表清零:
    BATTERY_STATUS batteryStatus = {0};
    
  • 调用ZeroMemory或memset清零:
    BATTERY_STATUS batteryStatus;
    ZeroMemory(&batteryStatus, sizeof(batteryStatus));
    

这是所有Windows原生结构体的标准初始化流程,即使官方文档未提及,也能保证API调用的兼容性。

二、通过WINAPI获取电池电压的方法

方法1:使用DeviceIoControl(推荐,直接获取电压值)

这是获取底层电池数据的官方方式,通过IOCTL_BATTERY_QUERY_STATUS控制码可直接拿到BATTERY_STATUS中的电压字段(毫伏单位):

#include <windows.h>
#include <powrprof.h>
#include <iostream>

#pragma comment(lib, "powrprof.lib")

int main() {
    // 打开系统第一个电池设备(多电池需循环枚举Battery0、Battery1...)
    HANDLE hBattery = CreateFile(L"\\\\.\\Battery0", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
                                NULL, OPEN_EXISTING, 0, NULL);
    if (hBattery == INVALID_HANDLE_VALUE) {
        std::cerr << "打开电池设备失败,错误码: " << GetLastError() << std::endl;
        return 1;
    }

    BATTERY_STATUS batteryStatus = {0};
    DWORD bytesReturned;
    // 查询电池状态
    BOOL result = DeviceIoControl(hBattery, IOCTL_BATTERY_QUERY_STATUS, 
                                 NULL, 0, &batteryStatus, sizeof(batteryStatus), 
                                 &bytesReturned, NULL);

    if (result) {
        std::cout << "当前电池电压: " << batteryStatus.BatteryVoltage << " 毫伏" << std::endl;
        std::cout << "剩余电量百分比: " << static_cast<int>(batteryStatus.BatteryLifePercent) << "%" << std::endl;
    } else {
        std::cerr << "查询电池状态失败,错误码: " << GetLastError() << std::endl;
    }

    CloseHandle(hBattery);
    return 0;
}

注意事项:

  • 需链接powrprof.lib库
  • 多设备场景下,需循环尝试打开BatteryX直到返回INVALID_HANDLE_VALUE
  • BatteryVoltage字段为毫伏值,转换为伏特需除以1000

方法2:GetSystemPowerStatus(仅作补充,无直接电压)

GetSystemPowerStatus返回的SYSTEM_POWER_STATUS结构体仅提供电量百分比、充电状态等信息,没有直接电压数据,仅适合快速获取基础电池状态:

SYSTEM_POWER_STATUS powerStatus = {0};
if (GetSystemPowerStatus(&powerStatus)) {
    std::cout << "剩余电量: " << static_cast<int>(powerStatus.BatteryLifePercent) << "%" << std::endl;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:12:53