詳細なシステム情報を取得するアプリケーションがあり、バッテリー自体のパーセントではなく、残りの充電のパーセントを取得できました。
説明:時間が経つにつれ、バッテリーは徐々に劣化し、ラップトップ上のDell Support Centerなどの一部のアプリケーションでは、バッテリーのステータスが表示されます。以前は100%でしたが、現在は90になっています。 %。
C#または.NETでこの値を取得するにはどうすればよいですか?
テストするラップトップはありませんが、WMIクラス Win32_Battery を使用できると思います。
興味深く見える2つのフィールドがあります-DesignCapacity
ミリワット時でのバッテリーの設計容量。
そしてFullChargeCapacity
には、
バッテリーのフル充電容量(ミリワット時)。値とDesignCapacityプロパティの比較により、バッテリーの交換が必要になる時期が決まります。
したがって、私の推測では、WMIを使用してこれら2つの値を読み取り、FullChargeCapacity/DesignCapacity
を計算して、バッテリーの正常性のパーセンテージの数値を見つけることができます。
[〜#〜]編集[〜#〜]
これは、C#を使用してWMI情報にアクセスする簡単な例です。最初に、System.Management
アセンブリへの参照を追加しました。次に:
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);
}
}
}
}
}
また、基本的にはSQLのようなクエリをWMIに対して実行しているので、必要に応じて変更することもできます。 Windows Management Instrumentation Query Language
、またはWQL
は、それについて詳しく知るために検索したいものです。
彼が指摘するように、WMIがバッテリーデータを正しくキャプチャしていない場合は、ホーカーの回答も確認してください。
FullChargeCapacity
、DesignCapacity
、CurrentCapacity
の値を探しているようです。以前にこの問題を解決したことがある人として、いくつかコメントさせてください。
通常行われる最初のルートは、WMIクエリ(Win32_Battery
)。ただし、テスト用ラップトップではWMIクエリ(Win32_Battery
)に対して、複数の製造元が含まれていたため、私は常にFullChargeCapacity
が常にゼロを返すという問題に遭遇しました。それが機能しなかったので、Win32 APIを使用してソリューションを書き直し、その方法で正確な値を取得することに成功しました。
うまくいけば、WMIがうまくいきます。ただし、私が行ったのと同じ問題が発生した場合は、Win32APIに必要な手順の概要を以下に示します。
SetupDiGetClassDevs
を使用して、バッテリーへのデバイスハンドルを取得します(GUID_DEVCLASS_BATTERY
)。
SetupDiEnumDeviceInterfaces
を使用してデバイスデータ(SP_DEVICE_INTERFACE_DATA
)。
SetupDiGetDeviceInterfaceDetail
を使用してデバイスパスを取得します(SP_DEVICE_INTERFACE_DETAIL_DATA
)。
バッテリーへのハンドルを取得するには、デバイスパスでCreateFile
を使用します。
電池ハンドル付きのDeviceIoControl
を使用してください、IOCTL_BATTERY_QUERY_TAG
は、バッテリークエリ情報を取得します(BATTERY_QUERY_INFORMATION
)。
電池ハンドル付きのDeviceIoControl
を使用してください、IOCTL_BATTERY_QUERY_INFORMATION
およびstructs
をマーシャリングして、バッテリー情報を取得します(BATTERY_INFORMATION
)。
また、MSDNの バッテリーデバイスの列挙 の投稿も参考にしてください。
必要に応じてソリューションを投稿できますが、すべてのネイティブstruct
定義を使用すると、約500行のコードになります。
ソースコードの例: https://Gist.github.com/ahawker/9715872
不必要に複雑なことをする必要はありません。次のようなものを試してください:
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);
このようにして、すべてのバッテリー情報を取得できます。
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);
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace batterie
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
showbattrie();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public void showbattrie()
{
PowerStatus status = SystemInformation.PowerStatus;
textBox1.Text = status.BatteryLifePercent.ToString("P0");
}
}
}
WMIは私のために機能しました(異なるブランドの3つのノートブックでテストされました)、しかし私はこのようなものを使わなければなりませんでした:
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();
何らかの操作を実行したい場合は、これらの文字列値を整数に変換するだけです。
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);
}