【问题标题】:Read Laptop Battery Status in Float/Double读取浮动/双倍的笔记本电脑电池状态
【发布时间】:2011-12-08 18:19:57
【问题描述】:

我有一个程序可以读取 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++ 以浮点/双精度形式获取电池百分比读数? (最好能用MinGW编译的方案)

【问题讨论】:

  • 你的意思是你想要更精确?还是您的意思是您希望 BatteryLife 为 1?
  • 请使用 Stack Overflow 的发布工具正确上传该图片;您发布链接的图片不能被热链接。
  • @Tomalak:我想得到一个显示十进制值的读数(例如 22.5、87.5)。由于我的代表,我不允许发布图片。
  • 然后至少发布一个有效的 URL。

标签: c++ winapi power-management


【解决方案1】:

嗯,正如你所说,Windows API provides only an integral percentage value。而且,正如您所暗示的,.NET provides a floating-point one

这意味着,要使用浮点数,您必须使用 .NET。也就是说,.NET 值介于 0.01.0 之间,从文档中不清楚您是否真的获得了更高的精度。

【讨论】:

    【解决方案2】:

    该工具声明它执行“Statistical Time Prediction”所以我怀疑它使用了SYSTEM_POWER_STATUS 的直接值。

    就我个人而言,我几乎无法想象浮点精度有什么好处,但无论如何你可以使用ILSpy 看看他们是如何做到的,或者你也可以询问他们是如何做到的。

    【讨论】:

      【解决方案3】:

      .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

      【讨论】:

        【解决方案4】:

        您可以使用 WMI 获取此信息。尝试使用 BatteryFullChargedCapacityBatteryStatus 类,它们都是 root\WMI 命名空间的一部分。

        要以百分比形式获取剩余电池电量,只需使用 RemainingCapacity (BatteryStatus) 和 FullChargedCapacity (BatteryFullChargedCapacity) 属性即可。

        剩余电池电量百分比为

        (RemainingCapacity * 100) / FullChargedCapacity

        例如,如果 FullChargedCapacity 属性报告 5266 值,而 RemainingCapacity 报告 5039,则结果将为 95,68932776 %

        如果您不知道如何从 C++ 访问 WMI,请阅读这些文章

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-31
          • 1970-01-01
          相关资源
          最近更新 更多