2006-06-07 14:26 [.NET CF] 偵測電池狀態
Windows Mobile 通常電力來源是電池,有時我們需要知道目前電池還剩多少電量,例如可以在電池即將用完前,自動存檔,或是提示玩家,甚至可以關閉音樂或一些顯示效果,以節省電力,本文僅說明如何偵測電池狀態。
偵測電池狀態可使用 Windows CE API 的 GetSystemPowerStatusEx2 函數,和 .NET Framwork 一樣使用 DllImportAttribute 載入 API 的 DLL 檔,DllImportAttribute 宣告於 System.Runtime.InteropServices 這個 namespace
using System.Runtime.InteropServices;
函數原型:
DWORD GetSystemPowerStatusEx2 (PSYSTEM_POWER_STATUS_EX2 pSystemPowerStatusEx2,
DWORD dwLen, BOOL fUpdate);
參數說明:
pSystemPowerStatusEx2 => 傳入一個 PSYSTEM_POWER_STATUS_EX2 結構,用以取得電池狀態資料
dwLen => 資料長度
fUpdate => 是否要偵測電池狀態,傳入 true 表示要偵測,傳入 false 表示讀取最後一次偵測的狀態。通常系統自動會 5 秒偵測一次,即使抓到最後一次狀態的資料,也和目前是非常接近的,建議傳入 false 。
於 C# 宣告:
[DllImport("coredll")]
private static extern uint GetSystemPowerStatusEx2(
SYSTEM_POWER_STATUS_EX2 lpSystemPowerStatus,
uint dwLen, bool fUpdate);
PSYSTEM_POWER_STATUS_EX2 的結構如下:
typedef struct _SYSTEM_POWER_STATUS_EX2 {
BYTE ACLineStatus;
BYTE BatteryFlag;
BYTE BatteryLifePercent;
BYTE Reserved1;
DWORD BatteryLifeTime;
DWORD BatteryFullLifeTime;
BYTE Reserved2;
BYTE BackupBatteryFlag;
BYTE BackupBatteryLifePercent;
BYTE Reserved3;
DWORD BackupBatteryLifeTime;
DWORD BackupBatteryFullLifeTime;
WORD BatteryVoltage;
DWORD BatteryCurrent;
DWORD BatteryAverageCurrent;
DWORD BatteryAverageInterval;
DWORD BatterymAHourConsumed;
DWORD BatteryTemperature;
DWORD BackupBatteryVoltage;
BYTE BatteryChemistry;
} SYSTEM_POWER_STATUS_EX2;
於 C# 只要這樣宣告就行了:
public class SYSTEM_POWER_STATUS_EX2
{
public byte ACLineStatus;
public byte BatteryFlag;
public byte BatteryLifePercent;
public byte Reserved1;
public uint BatteryLifeTime;
public uint BatteryFullLifeTime;
public byte Reserved2;
public byte BackupBatteryFlag;
public byte BackupBatteryLifePercent;
public byte Reserved3;
public uint BackupBatteryLifeTime;
public uint BackupBatteryFullLifeTime;
public uint BatteryVoltage;
public uint BatteryCurrent;
public uint BatteryAverageCurrent;
public uint BatteryAverageInterval;
public uint BatterymAHourConsumed;
public uint BatteryTemperature;
public uint BackupBatteryVoltage;
public byte BatteryChemistry;
}
此結構的欄位很多,幾個比較常用的欄位說明:
ACLineStatus 可能的值: AC_LINE_OFFLINE 0 未接上 AC 電源 AC_LINE_ONLINE 1 已接上 AC 電源 AC_LINE_BACKUP_POWER 2 使用備用電池 AC_LINE_UNKNOWN 255 未知 BatteryFlag 可能的值: BATTERY_FLAG_HIGH 1 電池還很夠用 BATTERY_FLAG_LOW 2 電池電量所剩無幾 BATTERY_FLAG_CRITICAL 4 電池即將用盡 BATTERY_FLAG_CHARGING 8 電池正在充電 BATTERY_FLAG_NO_BATTERY 128 本系統沒有電池 BATTERY_FLAG_UNKNOWN 255 電池狀況未知 BatteryFullLifeTime 表示電池充滿時,可使用的估計秒數,若無法估計,其值為: BATTERY_LIFE_UNKNOWN 4294967295 BatteryLifePercent 表示電池電量所剩餘的百分比(1~100),若無法估計,其值為: BATTERY_PERCENTAGE_UNKNOWN 255 BatteryLifeTime 表示電池電量耗盡前的估計秒數,若無法估計,其值為: BATTERY_LIFE_UNKNOWN 4294967295 BatteryChemistry 表示電池的種類,可能的值: BATTERY_CHEMISTRY_ALKALINE 0x01 BATTERY_CHEMISTRY_NICD 0x02 鎳鎘電池 BATTERY_CHEMISTRY_NIMH 0x03 鎳氫電池 BATTERY_CHEMISTRY_LION 0x04 鋰電池 BATTERY_CHEMISTRY_LIPOLY 0x05 BATTERY_CHEMISTRY_UNKNOWN 0xFF 電池種類未知
宣告這些常數:
public const uint AC_LINE_OFFLINE = 0; public const uint AC_LINE_ONLINE = 1; public const uint AC_LINE_BACKUP_POWER = 2; public const uint AC_LINE_UNKNOWN = 255; public const uint BATTERY_FLAG_HIGH = 1; public const uint BATTERY_FLAG_LOW = 2; public const uint BATTERY_FLAG_CRITICAL = 4; public const uint BATTERY_FLAG_CHARGING = 8; public const uint BATTERY_FLAG_NO_BATTERY = 128; public const uint BATTERY_FLAG_UNKNOWN = 255; public const uint BATTERY_PERCENTAGE_UNKNOWN = 255; public const uint BATTERY_LIFE_UNKNOWN = 4294967295; public const uint BATTERY_CHEMISTRY_ALKALINE = 0x01; public const uint BATTERY_CHEMISTRY_NICD = 0x02; public const uint BATTERY_CHEMISTRY_NIMH = 0x03; public const uint BATTERY_CHEMISTRY_LION = 0x04; public const uint BATTERY_CHEMISTRY_LIPOLY = 0x05; public const uint BATTERY_CHEMISTRY_UNKNOWN = 0xFF;
最後我只要執行這行,就能取得電池狀態資料:
GetSystemPowerStatusEx2(status, (uint)Marshal.SizeOf(status), false);
以下這範例會取得電池狀態,為了讓程式很簡單,我完全不放任何控制項,使用 MessageBox 來輸出資料: (此段程式無法直接執行,因為我省略了 Visual Studio 所產生的部份程式)
using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace test
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.MainMenu mainMenu1;
[DllImport("coredll")]
private static extern uint GetSystemPowerStatusEx2(
SYSTEM_POWER_STATUS_EX2 lpSystemPowerStatus,
uint dwLen, bool fUpdate);
public const uint AC_LINE_OFFLINE = 0;
public const uint AC_LINE_ONLINE = 1;
public const uint AC_LINE_BACKUP_POWER = 2;
public const uint AC_LINE_UNKNOWN = 255;
public const uint BATTERY_FLAG_HIGH = 1;
public const uint BATTERY_FLAG_LOW = 2;
public const uint BATTERY_FLAG_CRITICAL = 4;
public const uint BATTERY_FLAG_CHARGING = 8;
public const uint BATTERY_FLAG_NO_BATTERY = 128;
public const uint BATTERY_FLAG_UNKNOWN = 255;
public const uint BATTERY_PERCENTAGE_UNKNOWN = 255;
public const uint BATTERY_LIFE_UNKNOWN = 4294967295;
public const uint BATTERY_CHEMISTRY_ALKALINE = 0x01;
public const uint BATTERY_CHEMISTRY_NICD = 0x02;
public const uint BATTERY_CHEMISTRY_NIMH = 0x03;
public const uint BATTERY_CHEMISTRY_LION = 0x04;
public const uint BATTERY_CHEMISTRY_LIPOLY = 0x05;
public const uint BATTERY_CHEMISTRY_UNKNOWN = 0xFF;
// Visual Studio 產生的部分省略....
private void Form1_Load(object sender, EventArgs e)
{
string output = "";
SYSTEM_POWER_STATUS_EX2 status = new SYSTEM_POWER_STATUS_EX2();
GetSystemPowerStatusEx2(status, (uint)Marshal.SizeOf(status), false);
output += "AC電源狀態:" + status.ACLineStatus.ToString();
output += "n旗標:" + status.BatteryFlag.ToString();
output += "n所剩電量(%):" + status.BatteryLifePercent.ToString();
output += "n電池種類:" + status.BatteryChemistry.ToString();
MessageBox.Show(output);
}
}
public class SYSTEM_POWER_STATUS_EX2
{
public byte ACLineStatus;
public byte BatteryFlag;
public byte BatteryLifePercent;
public byte Reserved1;
public uint BatteryLifeTime;
public uint BatteryFullLifeTime;
public byte Reserved2;
public byte BackupBatteryFlag;
public byte BackupBatteryLifePercent;
public byte Reserved3;
public uint BackupBatteryLifeTime;
public uint BackupBatteryFullLifeTime;
public uint BatteryVoltage;
public uint BatteryCurrent;
public uint BatteryAverageCurrent;
public uint BatteryAverageInterval;
public uint BatterymAHourConsumed;
public uint BatteryTemperature;
public uint BackupBatteryVoltage;
public byte BatteryChemistry;
}
}
根據我的測試,在模擬器上執行無法順利取得資料,所以用實機來執行,執行畫面:
參考資料:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncfhowto/html/getpowstat.asp
回應


