Проверяем заряд аккумулятора на мобильном устройстве в C# .NET CF
В этой публикации я приведу пример получения информации о заряде аккумуляторов на мобильном устройстве под управлением Windows Mobile. Данный код написан очень давно. На днях вновь понадобился.
Для получения информации о заряде используем coredll. Получаем значения двух батареек, во многих КПК (во всяком случае промышленных, на подобии Motorola Symbol) используются 2 аккумулятора, один основной, другой резервный, для сохранности данных. Информацию можно получить и с того и с другого, если он конечно имеется.
Ну да хватит болтовни, к делу. Пример:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace PowerStatus
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/*Начало: Проверка батареек*/
//Более старая функция.
[DllImport("coredll")]
static public extern uint GetSystemPowerStatusEx(SYSTEM_POWER_STATUS_EX lpSystemPowerStatus, bool fUpdate);
//Более новая функция (побольше возможностей.
[DllImport("coredll")]
static public extern uint GetSystemPowerStatusEx2(SYSTEM_POWER_STATUS_EX2 lpSystemPowerStatus, uint dwLen, bool fUpdate);
//Структура новой функции.
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;
}
//Структура старой функции.
public class SYSTEM_POWER_STATUS_EX
{
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;
}
//Непосредственно - Функция получения информациии о заряде батареек.
//Буду использовать старубю функцию.
protected virtual string ReportPowerStatus(string what)
{
string result = "";
try
{
string status = string.Empty;
SYSTEM_POWER_STATUS_EX powerStatus;
powerStatus = new SYSTEM_POWER_STATUS_EX();
GetSystemPowerStatusEx(powerStatus, true);
string battery1 = powerStatus.BatteryLifePercent.ToString();
string battery2 = powerStatus.BackupBatteryLifePercent.ToString();
//Если передан параметр main - то основная батарея иначе backup батарея.
if (what == "main")
{
result = battery1;
}
else
{
result = battery2;
}
}
catch
{
}
return result;
}
/*Конец: Проверка батареек*/
private void menuItem2_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void menuItem3_Click(object sender, EventArgs e)
{
//Отображаем заряд батареек.
label1.Text = ReportPowerStatus("main");
label2.Text = ReportPowerStatus("backup");
//backup - может показать значение 255 - Это означает что значение не определено.
//Я это связываю с отсутствием батареи (возможно я ошибаюсь)
//Может надо просто воспользоваться более новой функцией.
//На более древних ОС всё нормально.
}
}
}
Вот собственно и всё.