バッテリや電源の状態を取得する。


Description

アプリケーションからバッテリの残量や電源の状態を知る方法。

How to

Win32の SystemPowerStatus APIを利用することで取得できます。

Sample Code

プロパティを参照するたびに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;
		}
	}
}

Copyright

改変等、ご自由にお使いください。特に作者名などを明記する必要はありません(したいなら別ですが)。