使用C#或.NET查找电池充电容量百分比

H B*_*amy 18 .net c# power-management

我有一个获取详细系统信息的应用程序,我已经能够获得剩余电量的百分比,但不能获得电池本身的百分比.

说明:随着时间的推移,电池变得越来越糟,一些应用程序,如笔记本电脑上的戴尔支持中心,显示电池的状态,而不是充电状态,曾经是100%,但现在是90 %.

如何在C#或.NET中获得此值?

dso*_*ano 18

没有笔记本电脑可以测试,但我猜你可以使用WMI类Win32_Battery.

它有两个看起来很有趣的领域 - DesignCapacity告诉你

电池的设计容量,以毫瓦时为单位.

并且FullChargeCapacity,它具有令人着迷的音符

电池完全充电容量,以毫瓦时为单位.将值与DesignCapacity属性进行比较可确定何时需要更换电池.

所以我的猜测是你可以使用WMI来读取这两个值,然后计算FullChargeCapacity/DesignCapacity以找到电池健康百分比数.

编辑

这是使用C#访问WMI信息的简短示例.我首先添加了对System.Management程序集的引用.然后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Management.ObjectQuery query = new ObjectQuery("Select * FROM Win32_Battery");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);

            ManagementObjectCollection collection = searcher.Get();

            foreach (ManagementObject mo in collection)
            {
                foreach (PropertyData property in mo.Properties)
                {
                    Console.WriteLine("Property {0}: Value is {1}", property.Name, property.Value);
                }                   
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,请注意您基本上是针对WMI运行类似SQL的查询,因此您可以根据需要改变它. Windows Management Instrumentation Query Language或者WQL,是您想要搜索以了解更多信息.

另外,看看ahawker的答案,如果WMI没有正确捕获电池数据,它可能会更有帮助,正如他所指出的那样.

  • @HBellamy,我添加了访问WMI的示例,请告诉我它是否有帮助. (2认同)

aha*_*ker 13

看来你正在寻找的价值FullChargeCapacity,DesignCapacityCurrentCapacity.作为以前解决过这个问题的人,请允许我发表一些意见.

通常采用的第一条路径是通过WMI查询(Win32_Battery).但是,在测试笔记本电脑上我运行WMI查询(Win32_Battery),其中包括多个制造商,我一直遇到FullChargeCapacity总是返回零的问题.由于这不起作用,我使用Win32 API重新编写了我的解决方案,并成功地以这种方式获得准确的值.

希望WMI能为您服务.但是,如果您遇到与我相同的问题,以下是Win32API所需步骤的摘要.

  • 使用SetupDiGetClassDevs可获取设备句柄电池(GUID_DEVCLASS_BATTERY).

  • 使用SetupDiEnumDeviceInterfaces来获得设备数据(SP_DEVICE_INTERFACE_DATA).

  • 使用SetupDiGetDeviceInterfaceDetail来获得设备路径(SP_DEVICE_INTERFACE_DETAIL_DATA).

  • 使用CreateFile设备路径来处理电池.

  • 使用DeviceIoControl电池手柄,IOCTL_BATTERY_QUERY_TAG检索电池查询信息(BATTERY_QUERY_INFORMATION).

  • 使用DeviceIoControl电池手柄,IOCTL_BATTERY_QUERY_INFORMATION并编组structs以检索电池信息(BATTERY_INFORMATION).

另请参阅MSDN上的Enumerating Battery Devices帖子,因为我发现它非常有帮助.

我可以在必要时发布我的解决方案,但是使用所有原生struct定义,它最终会产生大约500行代码.

示例源代码:https://gist.github.com/ahawker/9715872

  • 如果您能发布您的解决方案,这将非常有帮助。 (2认同)

小智 10

不需要不必要的复杂事情.尝试类似的东西:

using System.Management;

        String batterystatus;

        PowerStatus pwr = SystemInformation.PowerStatus;
        batterystatus = SystemInformation.PowerStatus.BatteryChargeStatus.ToString();

        MessageBox.Show("battery charge status : " + batterystatus);

        String batterylife;
        batterylife = SystemInformation.PowerStatus.BatteryLifePercent.ToString();

        MessageBox.Show(batterylife);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获得所有电池信息.

  • SystemInformation 不在“System.Management”命名空间中,而是在“System.Windows.Forms”中 (2认同)
  • @blade 是对的,这篇文章具有误导性,如果它不引用表单,它就无法在控制台应用程序上工作... (2认同)

Adi*_*iii 5

PowerStatus p = SystemInformation.PowerStatus;
int a = (int)(p.BatteryLifePercent * 100);
MessageBox.Show(""+a);
Run Code Online (Sandbox Code Playgroud)