Узнать емкость заряда аккумулятора в процентах, используя С# или .NET

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

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

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

Ответы

Ответ 1

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

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

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

и FullChargeCapacity, у которого есть увлекательная заметка о том, что

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

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

ИЗМЕНИТЬ

Вот краткий пример доступа к информации 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);
                }                   
            }
        }
    }
}

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

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

Ответ 2

Кажется, что вы ищете значения 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

Ответ 3

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

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

PowerStatus p = SystemInformation.PowerStatus;
int a = (int)(p.BatteryLifePercent * 100);
MessageBox.Show(""+a);

Ответ 6

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

Ответ 7

Простой код для получения уровня заряда батареи в С#

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

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

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

Ответ 9

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