2012-01-20 73 views
14

Tengo una aplicación que obtiene información detallada del sistema, y ​​he podido obtener el porcentaje de carga restante pero no el porcentaje de la batería.Averigüe la capacidad de carga de la batería en porcentaje usando C# o .NET

Explicación: A medida que pasa el tiempo, la batería empeora lentamente y algunas aplicaciones, como Dell Support Center en equipos portátiles, muestran el estado de la batería, no el estado de la carga, que solía ser 100% pero ahora es 90%.

¿Cómo puedo obtener este valor en C# o .NET?

+6

"Antes de votar para cerrar esto, eche un vistazo a la pregunta". Es de suponer que nadie votaría para cerrar su pregunta sin leerla primero. – ean5533

+0

@ ean5533: A veces me ha sucedido eso a veces. – Mehrdad

Respuesta

16

No tienen un ordenador portátil para probar con, pero supongo que podría utilizar la clase WMI Win32_Battery.

Tiene dos campos que parecen interesantes - DesignCapacity, para informarle

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

y FullChargeCapacity, que tiene la nota fascinante que

capacidad de carga total de la batería en milivatios-hora. La comparación del valor con la propiedad DesignCapacity determina cuándo debe reemplazarse la batería.

así que yo creo que se puede utilizar WMI para leer estos dos valores, y luego calcular FullChargeCapacity/DesignCapacity para encontrar el número de porcentaje estado de la batería.

EDITAR

He aquí un breve ejemplo de acceso a la información WMI usando C#. Primero agregué una referencia al ensamblaje System.Management. Entonces:

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

También, nota que está básicamente ejecutando una consulta de tipo SQL contra WMI, por lo que puede variar de que 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 vea la respuesta de ahawker, puede terminar siendo más útil si WMI no captura correctamente los datos de la batería, como señala.

+0

¿Cómo puedo usar esto en mi aplicación C#? –

+2

@HBellamy, agregué un ejemplo de acceso a WMI, avíseme si ayuda. – dsolimano

+0

Ahora bien, si solo esto estuviera disponible en las aplicaciones metropolitanas ... :( – Shaamaan

10

Parece que está buscando los valores de FullChargeCapacity, DesignCapacity y CurrentCapacity. Como alguien que ha resuelto este problema antes, déjame hacer algunos comentarios.

La primera ruta normalmente tomada sería a través de una consulta WMI (Win32_Battery). Sin embargo, en las laptops de prueba con las que ejecuté la consulta WMI (Win32_Battery), que incluía varios fabricantes, constantemente me encontré con el problema de FullChargeCapacity que siempre devuelve cero. Como eso no funcionó, volví a escribir mi solución usando Win32 API y pude obtener valores precisos de esa manera.

Afortunadamente, WMI funcionará para usted. Sin embargo, si experimenta los mismos problemas que yo, aquí hay un resumen de los pasos necesarios para Win32API.

  • Uso SetupDiGetClassDevs para obtener un identificador de dispositivo a la batería (GUID_DEVCLASS_BATTERY).

  • Usa SetupDiEnumDeviceInterfaces para obtener los datos del dispositivo (SP_DEVICE_INTERFACE_DATA).

  • Usa SetupDiGetDeviceInterfaceDetail para obtener la ruta del dispositivo (SP_DEVICE_INTERFACE_DETAIL_DATA).

  • Utilice CreateFile con la ruta del dispositivo para obtener el control de la batería.

  • Uso DeviceIoControl con mango a pilas, IOCTL_BATTERY_QUERY_TAG recuperar la información de consulta de la batería (BATTERY_QUERY_INFORMATION).

  • Uso DeviceIoControl con mango a pilas, IOCTL_BATTERY_QUERY_INFORMATION y movilizados a structs para recuperar información de la batería (BATTERY_INFORMATION).

Véase también el cargo Enumerating Battery Devices en MSDN como descubrí que muy útil.

Puedo publicar mi solución si es necesario pero con todas las definiciones nativas struct, termina alrededor de 500 líneas de código.

+0

Sería muy útil si pudiera publicar su solución. – SepehrM

0

código simple para obtener el nivel de la batería en 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); 

} 
1

WMI trabajado para mí (probado en 3 cuadernos de diferentes marcas), pero tuve que usar algo como esto:

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

n necesidad de complicar innecesariamente las cosas. Pruebe algo como:

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

De esta manera puede obtener toda la información de la batería.

+0

SystemInformation no está en el espacio de nombres 'System.Management', pero en' System.Windows.Forms' – blade

+0

@blade es correcto, esta publicación es engañosa, no funciona en una aplicación de consola si no hace referencia a formularios ... –

2
PowerStatus p = SystemInformation.PowerStatus; 
int a = (int)(p.BatteryLifePercent * 100); 
MessageBox.Show(""+a); 
0
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(); 

Si desea realizar alguna operación acaba de convertir estos valores de cadena en el número entero.

Cuestiones relacionadas