アプリケーションからバッテリの残量や電源の状態を知る方法。
Win32の SystemPowerStatus APIを利用することで取得できます。
プロパティを参照するたびにAPIを呼び出すのは無駄のような気がするので、電源の状態が更新されるのは「クラス作成時」「電源ラインの変更」「明示的な更新」のいずれかの時となっています。
とはいえ大したこともない気もするので、もし必要であればプロパティの中で更新するといいかもしれません。
using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace Misuzilla.Win32
{
public class PowerStatus
{
private static SystemPowerStatus _sps;
private
PowerStatus()
{
}
//
// 電源に接続されているかどうかを取得
//
public static Boolean
IsACLineConnected
{
get
{
//if (_sps.ACLineStatus == 255) throw new ApplicationException("ACLineStatus is UNKNOWN");
return (_sps.ACLineStatus == 1);
}
}
//
// バッテリの状態を取得
//
public static BatteryStatusFlags
BatteryStatus
{
get
{
return (BatteryStatusFlags)_sps.BatteryFlag;
}
}
//
// バッテリの残量をパーセンテージで取得
//
public static Byte
BatteryLifePercent
{
get
{
return _sps.BatteryLifePercent;
}
}
//
// バッテリの残量を残り時間(秒数)で取得
//
public static Int32
BatteryLifeTime
{
get
{
return _sps.BatteryLifeTime;
}
}
//
// バッテリが完全に充電されているときの残り時間を取得
//
public static Int32
BatteryFullLifeTime
{
get
{
return _sps.BatteryFullLifeTime;
}
}
//
// バッテリのステータスを表す列挙型
//
public enum
BatteryStatusFlags
{
High = 1,
Low = 2,
Critical = 4,
Charging = 8,
NoSystemBattery = 128,
Unknown = 255
}
//
// 内部に保持されている電源の状態を更新
//
public static void
RefreshPowerStatus()
{
W32GetSystemPowerStatus(out _sps);
}
//
// 静的コンストラクタ
//
static
PowerStatus()
{
W32GetSystemPowerStatus(out _sps);
SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(OnPowerModeChanged);
}
//
// 以下プライベート
//
private static void
OnPowerModeChanged(Object sender, PowerModeChangedEventArgs e)
{
Console.WriteLine("PowerStatus::OnPowerModeChanged");
W32GetSystemPowerStatus(out _sps);
}
[DllImport("kernel32.dll", EntryPoint="GetSystemPowerStatus")]
private static extern Boolean W32GetSystemPowerStatus(out SystemPowerStatus lpSystemPowerStatus);
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
private struct
SystemPowerStatus
{
public Byte ACLineStatus;
public Byte BatteryFlag;
public Byte BatteryLifePercent;
public Byte Reserved1;
public Int32 BatteryLifeTime;
public Int32 BatteryFullLifeTime;
}
}
}
改変等、ご自由にお使いください。特に作者名などを明記する必要はありません(したいなら別ですが)。