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?
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.
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
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.
Vous pouvez utiliser la classe System.Windows.Forms.PowerStatus - http://msdn.Microsoft.com/en-us/library/system.windows.forms.powerstatus.aspx
PowerStatus p = SystemInformation.PowerStatus;
int a = (int)(p.BatteryLifePercent * 100);
MessageBox.Show(""+a);
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"]
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.
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);
}