web-dev-qa-db-fra.com

Découvrez la capacité de charge de la batterie en pourcentage en utilisant C # ou .NET

J'ai une application qui obtient des informations détaillées sur le système et j'ai pu obtenir le pourcentage de charge restante, mais pas le pourcentage de la batterie elle-même.

Explication: Au fil du temps, la batterie devient de plus en plus mauvaise et certaines applications, telles que le Centre de support Dell sur ordinateurs portables, affichent l'état de la batterie, et non l'état de la charge, qui était à 100%, mais maintenant à 90%. %.

Comment puis-je obtenir cette valeur en C # ou .NET?

16
H Bellamy

Vous n'avez pas d'ordinateur portable à tester, mais j'imagine que vous pourriez utiliser la classe WMI Win32_Battery .

Il a deux champs qui ont l'air intéressants - DesignCapacity, qui vous dit 

Capacité nominale de la batterie en milliwatt-heure.

et FullChargeCapacity, qui a la note fascinante que

Capacité de charge complète de la batterie en milliwatt-heure. La comparaison de la valeur à la propriété DesignCapacity détermine le moment où la batterie doit être remplacée. 

Donc, je suppose que vous pouvez utiliser WMI pour lire ces deux valeurs, puis calculer FullChargeCapacity/DesignCapacity pour rechercher le nombre de pourcentage d’état de santé de la batterie.

EDIT

Voici un bref exemple d'accès aux informations WMI à l'aide de C #. J'ai d'abord ajouté une référence à l'assembly System.Management. Ensuite:

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

Notez également que vous exécutez une requête de type SQL contre WMI. Vous pouvez donc le modifier si vous le souhaitez. Windows Management Instrumentation Query Language, ou WQL, est ce que vous voulez rechercher pour en savoir plus à ce sujet.

Jetez également un coup d'œil à la réponse de ahawker, cela pourrait s'avérer plus utile si WMI ne capture pas correctement les données de la batterie, comme il le note.

17
dsolimano

Il semble que vous cherchiez les valeurs de FullChargeCapacity, DesignCapacity et CurrentCapacity. En tant que personne qui a résolu ce problème auparavant, laissez-moi faire quelques commentaires.

La première route normalement empruntée passerait par une requête WMI (Win32_Battery). Cependant, sur les ordinateurs portables de test sur lesquels j'ai lancé la requête WMI (Win32_Battery), qui incluait plusieurs fabricants, j'ai toujours rencontré le problème de FullChargeCapacity renvoyant toujours zéro. Comme cela ne fonctionnait pas, j'ai réécrit ma solution à l'aide de l'API Win32 et j'ai réussi à obtenir des valeurs précises de cette façon.

Espérons que WMI travaillera pour vous. Toutefois, si vous rencontrez les mêmes problèmes que moi, voici un résumé des étapes requises pour Win32API.

  • Utilisez SetupDiGetClassDevs pour obtenir une poignée d’appareil à la batterie (GUID_DEVCLASS_BATTERY).

  • Utilisez SetupDiEnumDeviceInterfaces pour obtenir les données du périphérique (SP_DEVICE_INTERFACE_DATA).

  • Utilisez SetupDiGetDeviceInterfaceDetail pour obtenir le chemin du périphérique (SP_DEVICE_INTERFACE_DETAIL_DATA).

  • Utilisez CreateFile avec le chemin de périphérique pour gérer la batterie.

  • Utilisez DeviceIoControl avec le manche de la batterie, IOCTL_BATTERY_QUERY_TAG pour récupérer les informations de requête de la batterie (BATTERY_QUERY_INFORMATION).

  • Utilisez DeviceIoControl avec la poignée de la batterie, IOCTL_BATTERY_QUERY_INFORMATION et marshalled structs pour récupérer les informations sur la batterie (BATTERY_INFORMATION).

Consultez également le Énumération des périphériques de batterie post sur MSDN, car j’ai trouvé cela très utile.

Je peux publier ma solution si nécessaire, mais avec toutes les définitions struct natives, elle aboutit à environ 500 lignes de code.

Exemple de code source: https://Gist.github.com/ahawker/9715872

12
ahawker

Pas besoin de compliquer inutilement les choses. Essayez quelque chose comme:

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 cette façon, vous pouvez obtenir toutes les informations sur la batterie.

7
user4536490

Vous pouvez utiliser la classe System.Windows.Forms.PowerStatus - http://msdn.Microsoft.com/en-us/library/system.windows.forms.powerstatus.aspx

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

WMI a fonctionné pour moi (testé sur 3 ordinateurs portables de marques différentes), mais je devais utiliser quelque chose comme ceci:

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"]
1
frank koch
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 vous souhaitez effectuer une opération, il suffit de convertir ces valeurs de chaîne en entier.

0
Monu Singh

Code simple pour obtenir le niveau de batterie 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);

} 
0
Deepak Ramesh