Saltar al contenido

Averigüe la capacidad de carga de la batería en porcentaje usando C# o .NET

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: DesignCapacityque te dice

Capacidad de diseño de la batería en milivatios-hora.

y FullChargeCapacityque 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 Languageo WQLes 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 ordenado structs 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *