首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C#或.NET以百分比形式了解电池充电容量

使用C#或.NET以百分比形式了解电池充电容量
EN

Stack Overflow用户
提问于 2012-01-21 02:17:16
回答 9查看 36.4K关注 0票数 25

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

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

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-01-21 02:27:53

虽然没有可以测试的笔记本电脑,但我猜您可以使用WMI类Win32_Battery

它有两个看起来很有趣的字段- DesignCapacity,它告诉您

电池的设计容量,以毫瓦时为单位。

还有FullChargeCapacity,它有一个引人入胜的注解

电池的充满电容量,单位为毫瓦小时。将该值与DesignCapacity属性进行比较可确定电池何时需要更换。

因此,我猜测您可以使用WMI读取这两个值,然后计算FullChargeCapacity/DesignCapacity以找到电池健康百分比。

编辑

下面是一个使用C#访问WMI信息的简单示例。我首先添加了对System.Management程序集的引用。然后:

代码语言:javascript
复制
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没有正确捕获电池数据,它可能最终会更有帮助。

票数 22
EN

Stack Overflow用户

发布于 2012-01-21 02:51:49

您似乎在寻找FullChargeCapacityDesignCapacityCurrentCapacity的值。作为以前解决过这个问题的人,让我做一些评论。

通常采用的第一个路由是通过WMI查询(Win32_Battery)。然而,在我运行WMI查询(Win32_Battery)的测试笔记本电脑上,我总是遇到FullChargeCapacity总是返回零的问题。由于这不起作用,我使用Win32应用编程接口重写了我的解决方案,并成功地以这种方式获得了精确值。

希望WMI能为您工作。但是,如果您遇到了与我相同的问题,下面是Win32API所需步骤的摘要。

使用SetupDiGetClassDevs获取电池(GUID_DEVCLASS_BATTERY).

  • Use SetupDiEnumDeviceInterfaces的设备句柄获取设备数据(SP_DEVICE_INTERFACE_DATA).

  • Use SetupDiGetDeviceInterfaceDetail获取设备路径(SP_DEVICE_INTERFACE_DETAIL_DATA).

  • Use CreateFile以及获取电池句柄的设备路径。

  • 使用带电池句柄的DeviceIoControlIOCTL_BATTERY_QUERY_TAG检索带有电池句柄的电池查询信息DeviceIoControl,用于检索电池信息(BATTERY_INFORMATION).

IOCTL_BATTERY_QUERY_INFORMATION和已编组structs

另请参阅MSDN上的Enumerating Battery Devices帖子,因为我发现这很有帮助。

如果需要,我可以发布我的解决方案,但由于所有原生struct定义,它最终需要大约500行代码。

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

票数 16
EN

Stack Overflow用户

发布于 2015-02-06 17:11:24

没有必要把事情复杂化。尝试如下所示:

代码语言:javascript
复制
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);

这样你就可以得到所有的电池信息。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8945986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档