[.NET CF] 偵測電池狀態 @ X's Blog :: 隨意窩 Xuite日誌
  • 關鍵字
    1. 沒有新回應!






  • 如何使用RSS
    Powered by Xuite
    2006-06-07 14:26 [.NET CF] 偵測電池狀態
    平均分數:0 顆星    投票人數:0
    我要評分:

    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 

    by cppbuilder (x@bcb.tw)
    X / Xuite日誌 / 回應(0) / 引用(0) / 好文轉寄
    回應