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没有正确捕获电池数据,它可能会更有帮助,正如他所指出的那样.
aha*_*ker 13
看来你正在寻找的价值FullChargeCapacity,DesignCapacity和CurrentCapacity.作为以前解决过这个问题的人,请允许我发表一些意见.
通常采用的第一条路径是通过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
小智 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)
通过这种方式,您可以获得所有电池信息.
您可以使用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);
Run Code Online (Sandbox Code Playgroud)