Узнать емкость заряда аккумулятора в процентах, используя С# или .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);
Таким образом вы можете получить всю информацию о батарее.
Ответ 4
Вы можете использовать класс System.Windows.Forms.PowerStatus - http://msdn.microsoft.com/en-us/library/system.windows.forms.powerstatus.aspx
Ответ 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");
}
}
}