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
相关产品推荐
相关产品推荐

