我有一个应用程序,它可以获取详细的系统信息,并且我能够获得剩余电量的百分比,但不能获得电池本身的百分比。
说明:随着时间的推移,电池慢慢变得越来越差,一些应用程序(如笔记本电脑上的戴尔支持中心)会显示电池的状态,而不是充电状态,以前是100%,但现在是90%。
如何在C#或.NET中获取此值?
发布于 2012-01-21 02:27:53
虽然没有可以测试的笔记本电脑,但我猜您可以使用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没有正确捕获电池数据,它可能最终会更有帮助。
发布于 2012-01-21 02:51:49
您似乎在寻找FullChargeCapacity、DesignCapacity和CurrentCapacity的值。作为以前解决过这个问题的人,让我做一些评论。
通常采用的第一个路由是通过WMI查询(Win32_Battery)。然而,在我运行WMI查询(Win32_Battery)的测试笔记本电脑上,我总是遇到FullChargeCapacity总是返回零的问题。由于这不起作用,我使用Win32应用编程接口重写了我的解决方案,并成功地以这种方式获得了精确值。
希望WMI能为您工作。但是,如果您遇到了与我相同的问题,下面是Win32API所需步骤的摘要。
使用SetupDiGetClassDevs获取电池(GUID_DEVCLASS_BATTERY).
SetupDiEnumDeviceInterfaces的设备句柄获取设备数据(SP_DEVICE_INTERFACE_DATA).
SetupDiGetDeviceInterfaceDetail获取设备路径(SP_DEVICE_INTERFACE_DETAIL_DATA).
CreateFile以及获取电池句柄的设备路径。
DeviceIoControl,IOCTL_BATTERY_QUERY_TAG检索带有电池句柄的电池查询信息DeviceIoControl,用于检索电池信息(BATTERY_INFORMATION).
的IOCTL_BATTERY_QUERY_INFORMATION和已编组structs
另请参阅MSDN上的Enumerating Battery Devices帖子,因为我发现这很有帮助。
如果需要,我可以发布我的解决方案,但由于所有原生struct定义,它最终需要大约500行代码。
发布于 2015-02-06 17:11:24
没有必要把事情复杂化。尝试如下所示:
using System.Management;
PowerStatus pwr = SystemInformation.PowerStatus;
String strBatteryChargingStatus;
strBatteryChargingStatus = pwr.BatteryChargeStatus.ToString();
MessageBox.Show("battery charge status : " + batterystatus);
String strBatterylife;
strBatterylife = pwr.BatteryLifePercent.ToString();
MessageBox.Show("Battery life: "+batterylife);这样你就可以得到所有的电池信息。
https://stackoverflow.com/questions/8945986
复制相似问题