我有一个获取详细系统信息的应用程序,我能够获得剩余电量的百分比,但不能获得电池本身的百分比。
说明:随着时间的推移,电池变得越来越糟,一些应用程序,如笔记本电脑上的戴尔支持中心,显示电池的状态,而不是充电状态,曾经是100%但是现在是90%。
如何在C#或.NET中获取此值?
答案 0 :(得分: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);
}
}
}
}
}
另外,请注意,您基本上是针对WMI运行类似SQL的查询,因此您可以根据需要改变它。 Windows Management Instrumentation Query Language
或WQL
是您要搜索的内容,以便了解详情。
另外,看看ahawker的回答,如果WMI没有正确捕获电池数据,它可能会更有帮助,正如他所指出的那样。
答案 1 :(得分:12)
您似乎在寻找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行代码。
答案 2 :(得分:9)
不需要不必要的复杂事情。尝试类似:
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);
通过这种方式,您可以获得所有电池信息。
答案 3 :(得分:5)
您可以使用System.Windows.Forms.PowerStatus类 - http://msdn.microsoft.com/en-us/library/system.windows.forms.powerstatus.aspx
答案 4 :(得分:2)
PowerStatus p = SystemInformation.PowerStatus;
int a = (int)(p.BatteryLifePercent * 100);
MessageBox.Show(""+a);
答案 5 :(得分:1)
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"]
答案 6 :(得分:1)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace batterie
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
showbattrie();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public void showbattrie()
{
PowerStatus status = SystemInformation.PowerStatus;
textBox1.Text = status.BatteryLifePercent.ToString("P0");
}
}
}
答案 7 :(得分:0)
使用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);
}
答案 8 :(得分:0)
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();
如果要执行某些操作,只需将这些字符串值转换为整数。