取WM5.0电池电量Windows API 问题
各路高手,
我现在遇到些问题:在取电池电量的时候用到Windows API了,但是还是总是有些问题。
public class SYSTEM_POWER_STATUS_EX2
{
// Fields
public byte ACLineStatus;
public byte BackupBatteryFlag;
public uint BackupBatteryFullLifeTime;
public byte BackupBatteryLifePercent;
public uint BackupBatteryLifeTime;
public uint BackupBatteryVoltage;
public uint BatteryAverageCurrent;
public uint BatteryAverageInterval;
public byte BatteryChemistry;
public uint BatteryCurrent;
public byte BatteryFlag;
public uint BatteryFullLifeTime;
public byte BatteryLifePercent;
public uint BatteryLifeTime;
public uint BatterymAHourConsumed;
public uint BatteryTemperature;
public uint BatteryVoltage;
public byte Reserved1;
public byte Reserved2;
public byte Reserved3;
// Methods
public SYSTEM_POWER_STATUS_EX2()
{
}
}
[DllImport( "coredll ")]
private static extern uint GetSystemPowerStatusEx2(SYSTEM_POWER_STATUS_EX2 lpSystemPowerStatus, uint dwLen, bool fUpdate);
SYSTEM_POWER_STATUS_EX2 status2 = new SYSTEM_POWER_STATUS_EX2();
通过下列方法以后还是取不到电量。status2一直是null.
GetSystemPowerStatusEx2(this.status2, (uint) Marshal.SizeOf(this.status2), false)
各路高手,看看这到底是什么问题?
[解决办法]
这种与硬件相关的函数,除了用法正确外,还要就是OEM厂家在实现驱动的时候,有没有实现它。楼主用的是什么硬件呢?要注意的。
[解决办法]
跟硬件驱动有关的东西,你最好确定一下.
这里有点资料给你看看.
WinCE 的电源是通过电源管理器(Power manager,以下简称PM)来进行管理,自然我们
要获取其电源信息也必须通过PM 接口.当底层驱动检测到电源状态发生变化时,PM 就会广播消
息,我们所需要做的就是接收此消息,并把包含的参数转换为我们所需要的数值.
要捕获电源消息,最重要就是创建消息队列:
HANDLE hReq = NULL;
hReq = RequestPowerNotifications(rghWaits[0], PBT_POWERINFOCHANGE);
"PBT_POWERINFOCHANGE "形参意味着只要电源信息有变动,就会收到信号.
除此以外,还有三个形参,分别是:
PBT_TRANSITION:系统的电源状态改变时,比如 "挂起 "
PBT_RESUME:状态恢复时,将把现在状态设置为前状态
PBT_POWERSTATUSCHANGE: 当AC-> DC 或DC-> AC 转换时发出信号
接下来我们需要做的就是采用MsgWaitForMultipleObjectsEx()函数来等待消息.如果返
回的数值是WAIT_OBJECT_0,那么我们已经收到我们所需要的信号,然后要做的就是通过
ReadMsgQueue()函数读取电源信息.
ReadMsgQueue(rghWaits[0], ppb, sizeof(pbMsgBuf), &dwSize, 0,
&dwFlags);
因为所有信息都包含于缓存ppb 中,我们只要通过强制转换就能够比较方便地获取电源
的状态信息.
PPOWER_BROADCAST_POWER_INFO ppbpi =
(PPOWER_BROADCAST_POWER_INFO) ppb-> SystemPowerState;
PPOWER_BROADCAST_POWER_INFO 结构信息丰富,如果仅仅意在检测电源的状
态,我们只需要关注这两个变量即可:bACLineStatus 和bBatteryLifePercent.前者标识是否
插入AC,后者表明当前电池的电量百分比.
我们可以先判断bACLineStatus 的状态.如果为TRUE,一定接上AC,然后此时又可分为
"正在充电 "和 "充电完毕 "两种状态;如果为FALSE,那么就在使用备用电池,我们只需要关注电量
的百分比即可.