DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

電源、バッテリーに関する情報を取得する

.NET Framework 2.0からは、SystemInformationクラス(System.Windows.Forms名前空間)のPowerStatusプロパティにより、電源やバッテリーの情報を取得することができます。

補足:.NET Framework 1.1以前では、WMIのWin32_Batteryクラスを使うなどの方法により、バッテリーに関する情報を取得できます。

以下に示すコードでは、AC電源に接続されているかバッテリーを使用しているか、バッテリーの残量、残り時間などの情報を表示しています。

VB.NET
コードを隠すコードを選択
Dim ps As PowerStatus = SystemInformation.PowerStatus

'電源に接続されているか
Select Case ps.PowerLineStatus
    Case PowerLineStatus.Online
        Console.WriteLine("AC電源に接続されています")
    Case PowerLineStatus.Offline
        Console.WriteLine("バッテリーを使用しています")
    Case PowerLineStatus.Unknown
        Console.WriteLine("電源ステータスは不明です")
End Select

'バッテリー残量
Console.WriteLine("バッテリー残量:{0}%", _
    IIf(ps.BatteryLifePercent > 100, "(不明)", ps.BatteryLifePercent.ToString()))
Console.WriteLine("残り時間:{0}秒/{1}秒", _
    IIf(ps.BatteryLifeRemaining < 0, "(不明)", ps.BatteryLifeRemaining.ToString()), _
    IIf(ps.BatteryFullLifetime < 0, "(不明)", ps.BatteryFullLifetime.ToString()))
Select Case ps.BatteryChargeStatus
    Case BatteryChargeStatus.High
        Console.WriteLine("バッテリー残量は十分あります")
    Case BatteryChargeStatus.Low
        Console.WriteLine("バッテリー残量が少ないです")
    Case BatteryChargeStatus.Critical
        Console.WriteLine("すぐに充電してください")
    Case BatteryChargeStatus.Charging
        Console.WriteLine("充電中です")
    Case BatteryChargeStatus.NoSystemBattery
        Console.WriteLine("バッテリーを使用していません")
    Case BatteryChargeStatus.Unknown
        Console.WriteLine("バッテリー状態は不明です")
End Select
C#
コードを隠すコードを選択
PowerStatus ps = SystemInformation.PowerStatus;

//電源に接続されているか
switch (ps.PowerLineStatus)
{
    case PowerLineStatus.Online:
        Console.WriteLine("ACに接続されています");
        break;
    case PowerLineStatus.Offline:
        Console.WriteLine("バッテリーを使用しています");
        break;
    case PowerLineStatus.Unknown:
        Console.WriteLine("電源ステータスは不明です");
        break;
}

//バッテリー残量
Console.WriteLine("バッテリー残量:{0}%",
    ps.BatteryLifePercent > 100 ? "(不明)" : ps.BatteryLifePercent.ToString());
Console.WriteLine("残り時間:{0}秒/{1}秒",
    ps.BatteryLifeRemaining < 0 ? "(不明)" : ps.BatteryLifeRemaining.ToString(),
    ps.BatteryFullLifetime < 0 ? "(不明)" : ps.BatteryFullLifetime.ToString());
switch (ps.BatteryChargeStatus)
{
    case BatteryChargeStatus.High:
        Console.WriteLine("バッテリー残量は十分あります");
        break;
    case BatteryChargeStatus.Low:
        Console.WriteLine("バッテリー残量が少ないです");
        break;
    case BatteryChargeStatus.Critical:
        Console.WriteLine("すぐに充電してください");
        break;
    case BatteryChargeStatus.Charging:
        Console.WriteLine("充電中です");
        break;
    case BatteryChargeStatus.NoSystemBattery:
        Console.WriteLine("バッテリーを使用していません");
        break;
    case BatteryChargeStatus.Unknown:
        Console.WriteLine("バッテリー状態は不明です");
        break;
}

電源、バッテリーの状態が変化したことを知る

SystemEventsクラスのPowerModeChangedイベントにより、電源やバッテリーの状態が変化したことを知ることができます。例えば、AC電源からバッテリーへの移行、バッテリー電圧の低下などによりイベントが発生します。PowerModeChangedイベントは、OSが中断状態(スタンバイ、サスペンド状態)になったり、中断状態から復帰した場合にも発生しますが、下に示す例のように、これらを区別することができます。

VB.NET
コードを隠すコードを選択
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As EventArgs) Handles MyBase.Load
    'イベントをイベント ハンドラに関連付ける
    'フォームコンストラクタなどの適当な位置に記述してもよい
    AddHandler Microsoft.Win32.SystemEvents.PowerModeChanged, _
        AddressOf SystemEvents_PowerModeChanged
End Sub

'フォームのFormClosedイベントハンドラ
Private Sub Form1_FormClosed(ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.FormClosedEventArgs) _
        Handles MyBase.FormClosed
    'イベントを開放する
    'フォームDisposeメソッド内の基本クラスのDisposeメソッド呼び出しの前に
    '記述してもよい
    RemoveHandler Microsoft.Win32.SystemEvents.PowerModeChanged, _
        AddressOf SystemEvents_PowerModeChanged
End Sub

Private Sub SystemEvents_PowerModeChanged(ByVal sender As Object, _
        ByVal e As Microsoft.Win32.PowerModeChangedEventArgs)
    Select Case e.Mode
        Case Microsoft.Win32.PowerModes.StatusChange
            Console.WriteLine("電源の状態が変化しました。")
        Case Microsoft.Win32.PowerModes.Suspend
            Console.WriteLine("OSが中断状態になりました。")
        Case Microsoft.Win32.PowerModes.Resume
            Console.WriteLine("OSが中断状態から復帰しました。")
    End Select
End Sub
C#
コードを隠すコードを選択
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
    //イベントをイベント ハンドラに関連付ける
    //フォームコンストラクタなどの適当な位置に記述してもよい
    Microsoft.Win32.SystemEvents.PowerModeChanged +=
        new Microsoft.Win32.PowerModeChangedEventHandler(
            SystemEvents_PowerModeChanged);
}

//フォームのFormClosedイベントハンドラ
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    //イベントを開放する
    //フォームDisposeメソッド内の基本クラスのDisposeメソッド呼び出しの前に
    //記述してもよい
    Microsoft.Win32.SystemEvents.PowerModeChanged -=
        new Microsoft.Win32.PowerModeChangedEventHandler(
            SystemEvents_PowerModeChanged);
}

private void SystemEvents_PowerModeChanged(object sender,
    Microsoft.Win32.PowerModeChangedEventArgs e)
{
    switch (e.Mode)
    {
        case Microsoft.Win32.PowerModes.StatusChange:
            Console.WriteLine("電源の状態が変化しました。");
            break;
        case Microsoft.Win32.PowerModes.Suspend:
            Console.WriteLine("OSが中断状態になりました。");
            break;
        case Microsoft.Win32.PowerModes.Resume:
            Console.WriteLine("OSが中断状態から復帰しました。");
            break;
    }
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。