首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

取WM5.0电池电量Windows API 有关问题

2012-02-07 
取WM5.0电池电量Windows API 问题各路高手,我现在遇到些问题:在取电池电量的时候用到WindowsAPI了,但是还

取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,那么就在使用备用电池,我们只需要关注电量
的百分比即可.

热点排行