Узнайте емкость заряда батареи в процентах, используя C # или .NET - PullRequest
18 голосов
/ 20 января 2012

У меня есть приложение, которое получает подробную информацию о системе, и я смог получить процент оставшегося заряда, но не процент самой батареи.

Объяснение: С течением времени батарея постепенно становится все хуже и хуже, и некоторые приложения, такие как Dell Support Center на ноутбуках, отображают состояние батареи, а не состояние заряда, которое раньше составляло 100%, но сейчас 90%.

Как я могу получить это значение в C # или .NET?

Ответы [ 9 ]

18 голосов
/ 20 января 2012

У меня нет ноутбука для тестирования, но я полагаю, вы могли бы использовать класс WMI Win32_Battery .

У него есть два поля, которые выглядят интересно - DesignCapacity,который говорит вам

Расчетная емкость батареи в милливатт-часах.

и FullChargeCapacity, которая имеет захватывающее примечание, что

Полная зарядная емкость аккумулятора в милливатт-часах.Сравнение значения со свойством DesignCapacity определяет, когда батарея требует замены.

Таким образом, я предполагаю, что вы можете использовать WMI, чтобы прочитать эти два значения, а затем вычислить FullChargeCapacity/DesignCapacity, чтобы найти процентное значение состояния батареи.

РЕДАКТИРОВАТЬ

Вот краткий пример доступа к информации WMI с использованием C #.Сначала я добавил ссылку на сборку 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);
                }                   
            }
        }
    }
}

Также обратите внимание, что вы в основном выполняете SQL-подобный запрос к WMI, так что вы можете изменить его, если хотите.Windows Management Instrumentation Query Language, или WQL, это то, что вы хотите найти, чтобы узнать больше об этом.

Также взгляните на ответ ahawker, это может оказаться более полезным, если WMI не захватывает должным образомданные батареи, как он отмечает.

13 голосов
/ 20 января 2012

Похоже, вы ищете значения 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, поскольку я нашел это весьма полезным.

При необходимости я могу опубликовать свое решение, но со всеми нативными определениями struct оно заканчивается примерно 500 строками кода.

Пример исходного кода: https://gist.github.com/ahawker/9715872

9 голосов
/ 06 февраля 2015

Не нужно ненужных усложнять вещи. Попробуйте что-то вроде:

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);

Таким образом, вы можете получить всю информацию о батарее.

5 голосов
/ 20 января 2012

Вы можете использовать класс System.Windows.Forms.PowerStatus - http://msdn.microsoft.com/en-us/library/system.windows.forms.powerstatus.aspx

2 голосов
/ 08 февраля 2015
PowerStatus p = SystemInformation.PowerStatus;
int a = (int)(p.BatteryLifePercent * 100);
MessageBox.Show(""+a);
1 голос
/ 12 июня 2019
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");
        }
    }
}
1 голос
/ 28 июля 2014

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"]
0 голосов
/ 25 июля 2015
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();

Если вы хотите выполнить какую-либо операцию, просто преобразуйте эти строковые значения в целое число.

0 голосов
/ 24 мая 2013

Простой код для получения уровня заряда батареи в 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);

} 
...