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

时间:2012-01-20 18:17:16

标签: c# .net power-management

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

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

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

9 个答案:

答案 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 LanguageWQL是您要搜索的内容,以便了解详情。

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

答案 1 :(得分:12)

您似乎在寻找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和设备路径来处理电池。

  • 使用带有电池手柄的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 :(得分: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)

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"]

答案 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();

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