我有一个程序可以在Windows中读取电池状态,如下所示(简化代码):
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char *argv[]) {
SYSTEM_POWER_STATUS spsPwr;
if( GetSystemPowerStatus(&spsPwr) ) {
cout << "\nAC Status : " << static_cast<double>(spsPwr.ACLineStatus)
<< "\nBattery Status : " << static_cast<double>(spsPwr.BatteryFlag)
<< "\nBattery Life % : " << static_cast<double>(spsPwr.BatteryLifePercent)
<< endl;
return 0;
} else return 1;
}
spsPwr.BatteryLifePercent
保留剩余电池电量百分比,且类型为BYTE
,这意味着它只能显示整数读数(即int
)。我注意到名为BatteryBar的应用程序可以用浮点值显示电池百分比。
BatteryBar是一个.NET应用程序。如何使用带有Windows API的纯C / C ++获得float / double的电池百分比读数? (可以使用MinGW编译的解决方案更可取)
答案 0 :(得分:3)
您可以使用WMI获取此信息。尝试使用BatteryFullChargedCapacity
和BatteryStatus
类都是root\WMI
命名空间的一部分。
要以百分比计算剩余电量,只需使用RemainingCapacity
(BatteryStatus)和FullChargedCapacity
(BatteryFullChargedCapacity)属性。
剩余电池电量百分比是
(RemainingCapacity * 100)/ FullChargedCapacity
例如,如果FullChargedCapacity属性报告5266
值且RemainingCapacity报告5039
,则reuslt将为95,68932776 %
如果您不知道如何从C ++访问WMI阅读这些文章
答案 1 :(得分:1)
好吧,正如你所说,Windows API provides only an integral percentage value。而且,正如你暗示的那样,.NET provides a floating-point one。
这意味着,要使用浮点数,必须使用.NET。也就是说,.NET值介于0.0
和1.0
之间,从文档中不清楚您是否真正获得了更高的精度。
答案 2 :(得分:0)
它执行“Statistical Time Prediction”的工具统计信息,因此我怀疑它使用SYSTEM_POWER_STATUS
的直接值。
就个人而言,我几乎无法想象浮点精度会有什么好处,但无论如何你可以使用ILSpy看看他们是怎么做的,或者你也可以问他们是怎么做的。
答案 3 :(得分:0)
.NET版本实际上并没有为您提供更高的精度。它只是将BatterLifePercent
字节值除以100.0并返回结果。以下是.NET中getter的内容。
public float BatteryLifePercent
{
get
{
this.UpdateSystemPowerStatus();
float num = ((float) this.systemPowerStatus.BatteryLifePercent) / 100f;
if (num <= 1f)
{
return num;
}
return 1f;
}
}
UpdateSystemPowerStatus()
调用了WINAPI GetSystemPowerStatus()
,后者又更新systemPowerStatus
。