Si encuentras alguna parte que te causa duda puedes dejarnos un comentario y haremos todo lo posible de ayudarte tan rápido como podamos.
Solución:
No tengo una computadora portátil para probar, pero supongo que podría usar la clase WMI Win32_Battery.
Tiene dos campos que parecen interesantes: DesignCapacity
que te dice
Capacidad de diseño de la batería en milivatios-hora.
y FullChargeCapacity
que tiene la nota fascinante de que
Capacidad de carga completa de la batería en milivatios-hora. La comparación del valor con la propiedad DesignCapacity determina cuándo es necesario reemplazar la batería.
Entonces, supongo que puede usar WMI para leer estos dos valores y luego calcular FullChargeCapacity/DesignCapacity
para encontrar el número de porcentaje de salud de la batería.
EDITAR
Este es un breve ejemplo de cómo acceder a la información de WMI mediante C#. Primero agregué una referencia a la System.Management
montaje. Luego:
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);
Además, tenga en cuenta que básicamente está ejecutando una consulta similar a SQL contra WMI, por lo que puede variar eso si lo desea. Windows Management Instrumentation Query Language
o WQL
es lo que desea buscar para obtener más información al respecto.
También eche un vistazo a la respuesta de un vendedor ambulante, puede terminar siendo más útil si WMI no está capturando correctamente los datos de la batería, como señala.
Parece que estás buscando los valores de FullChargeCapacity
, DesignCapacity
y CurrentCapacity
. Como alguien que ha resuelto este problema antes, permítanme hacer algunos comentarios.
La primera ruta normalmente tomada sería a través de una consulta WMI (Win32_Battery
). Sin embargo, en las computadoras portátiles de prueba ejecuté la consulta WMI (Win32_Battery
) en contra, que incluía múltiples fabricantes, me encontré constantemente con el problema de FullChargeCapacity
siempre devolviendo cero. Como eso no funcionó, volví a escribir mi solución usando la API de Win32 y pude obtener valores precisos de esa manera.
Con suerte, WMI funcionará para usted. Sin embargo, si experimenta los mismos problemas que yo, aquí hay un resumen de los pasos necesarios para Win32API.
-
Utilizar
SetupDiGetClassDevs
para obtener un identificador de dispositivo para la batería (GUID_DEVCLASS_BATTERY
). -
Utilizar
SetupDiEnumDeviceInterfaces
para obtener los datos del dispositivo (SP_DEVICE_INTERFACE_DATA
). -
Utilizar
SetupDiGetDeviceInterfaceDetail
para obtener la ruta del dispositivo (SP_DEVICE_INTERFACE_DETAIL_DATA
). -
Utilizar
CreateFile
con la ruta del dispositivo para controlar la batería. -
Utilizar
DeviceIoControl
con mango de batería,IOCTL_BATTERY_QUERY_TAG
para recuperar información de consulta de batería (BATTERY_QUERY_INFORMATION
). -
Utilizar
DeviceIoControl
con mango de batería,IOCTL_BATTERY_QUERY_INFORMATION
y ordenadostructs
a para recuperar información de la batería (BATTERY_INFORMATION
).
Consulte también la publicación Enumeración de dispositivos de batería en MSDN, ya que me pareció muy útil.
Puedo publicar mi solución si es necesario pero con todos los nativos struct
definiciones, termina en alrededor de 500 líneas de código.
Ejemplo de código fuente: https://gist.github.com/ahawker/9715872
No hay necesidad de complicar las cosas innecesariamente. Prueba algo como:
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);
De esta manera puede obtener toda la información de la batería.
Si haces scroll puedes encontrar las ilustraciones de otros desarrolladores, tú incluso puedes insertar el tuyo si te apetece.