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

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

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

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

没有笔记本电脑可以测试,但我猜你可以使用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); } } } } } 

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

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

您似乎正在寻找FullChargeCapacityDesignCapacityCurrentCapacity的值。 作为以前解决过这个问题的人,请允许我发表一些意见。

通常采用的第一条路径是通过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与设备路径一起使用以获取电池处理。

  • 使用带电池手柄的DeviceIoControlIOCTL_BATTERY_QUERY_TAG来检索电池查询信息( BATTERY_QUERY_INFORMATION )。

  • 使用带有电池手柄的DeviceIoControlIOCTL_BATTERY_QUERY_INFORMATION和编组structs来检索电池信息( BATTERY_INFORMATION )。

另请参阅MSDN上的Enumerating Battery Devicespost,因为我发现它非常有帮助。

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

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

不需要不必要的复杂事情。 尝试以下方法:

 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); 

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

您可以使用System.Windows.Forms.PowerStatus类 – http://msdn.microsoft.com/en-us/library/system.windows.forms.powerstatus.aspx

 PowerStatus p = SystemInformation.PowerStatus; int a = (int)(p.BatteryLifePercent * 100); MessageBox.Show(""+a); 

WMI为我工作(在3个不同品牌的笔记本上测试过),但我不得不使用这样的东西:

 new ManagementObjectSearcher(@"\\localhost\root\wmi", "Select FullChargedCapacity From BatteryFullChargedCapacity"); // use value of resultingInstance.Properties["FullChargedCapacity"] new ManagementObjectSearcher(@"\\localhost\root\wmi", "Select DesignedCapacity From BatteryStaticData"); //use value of resultingInstance2.Properties["DesignedCapacity"] 

用C#获取电池电量的简单代码

 protected void batteryLevel () { var filter = new IntentFilter(Intent.ActionBatteryChanged); var battery = RegisterReceiver(null, filter); int level = battery.GetIntExtra(BatteryManager.ExtraLevel, -1); int scale = battery.GetIntExtra(BatteryManager.ExtraScale, -1); double level_0_to_100 = Math.Floor (level * 100D / scale); } 
 BatteryChargeStatus.Text = SystemInformation.PowerStatus.BatteryChargeStatus.ToString(); BatteryFullLifetime.Text = SystemInformation.PowerStatus.BatteryFullLifetime.ToString(); BatteryLifePercent.Text = SystemInformation.PowerStatus.BatteryLifePercent.ToString(); BatteryLifeRemaining.Text = SystemInformation.PowerStatus.BatteryLifeRemaining.ToString(); PowerLineStatus.Text = SystemInformation.PowerStatus.PowerLineStatus.ToString(); 

如果要执行某些操作,只需将这些字符串值转换为整数。