以浮点/双精度读取笔记本电脑电池状态

时间:2011-10-16 15:01:04

标签: c++ winapi power-management

我有一个程序可以在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编译的解决方案更可取)

4 个答案:

答案 0 :(得分:3)

您可以使用WMI获取此信息。尝试使用BatteryFullChargedCapacityBatteryStatus类都是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.01.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