web-dev-qa-db-ja.com

C#または.NETを使用してバッテリーの充電容量をパーセンテージで確認する

詳細なシステム情報を取得するアプリケーションがあり、バッテリー自体のパーセントではなく、残りの充電のパーセントを取得できました。

説明:時間が経つにつれ、バッテリーは徐々に劣化し、ラップトップ上のDell Support Centerなどの一部のアプリケーションでは、バッテリーのステータスが表示されます。以前は100%でしたが、現在は90になっています。 %。

C#または.NETでこの値を取得するにはどうすればよいですか?

20
H Bellamy

テストするラップトップはありませんが、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がバッテリーデータを正しくキャプチャしていない場合は、ホーカーの回答も確認してください。

18
dsolimano

FullChargeCapacityDesignCapacityCurrentCapacityの値を探しているようです。以前にこの問題を解決したことがある人として、いくつかコメントさせてください。

通常行われる最初のルートは、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

13
ahawker

不必要に複雑なことをする必要はありません。次のようなものを試してください:

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

このようにして、すべてのバッテリー情報を取得できます。

9
user4536490

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

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"]
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();

何らかの操作を実行したい場合は、これらの文字列値を整数に変換するだけです。

0
Monu Singh

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