分享
 
 
 

从AP中获取电池和电源信息变更通知的方法

王朝other·作者佚名  2007-03-02
窄屏简体版  字體: |||超大  

在WinCE的项目开发过程中经常要编写AP来获取电池的电量和电源的来源等信息,由于WinCE底层的电池驱动一般以查询的方式得到电池的状态然后更新到一个结构体中,AP可以调用GetSystemPowerStatusEx2来得到这个结构体的数值,为了实时的更新电池的信息AP必须频繁的调用函数去得到数据更新。

其实WinCE的电源管理中已经集成了一种notify机制,会在电池信息发生变化时发出提醒。

RequestPowerNotifications函数可以被AP用来请求接收这种提醒服务。

AP在调用这个API之前必须创建一个消息队列,可以用CreateMsgQueue来实现。

接受提醒的方式是使用WaitForSingleObject来实现,该函数会一直等待直到收到电源管理发来的提醒,然后AP可以去读取消息队列中的数据来判定具体电源系统发生了哪些变化,然后做相关的事情比如更新UI的显示等。

参考源代码:

//#################################################################

#include <Pm.h>

#define QUEUE_ENTRIES 3

#define MAX_NAMELEN 200

#define QUEUE_SIZE (QUEUE_ENTRIES * (sizeof(POWER_BROADCAST) + MAX_NAMELEN))

HANDLE hMsgQ;

DWORD WINAPI PowerChangeListen(void * temp_p)

{

UCHAR buf[QUEUE_SIZE];

unsigned long nRead = 0, flags = 0, res = 0;

while(1)

{

DWORD dwRes = WaitForSingleObject(hMsgQ,INFINITE);

if(dwRes==WAIT_OBJECT_0)

{

memset(&buf, 0, QUEUE_SIZE);

if (ReadMsgQueue(hMsgQ, &buf, QUEUE_SIZE, &nRead, INFINITE, &flags))

{

PPOWER_BROADCAST pB = (PPOWER_BROADCAST)&buf;

PPOWER_BROADCAST_POWER_INFO ppbpi = (PPOWER_BROADCAST_POWER_INFO) pB->SystemPowerState;

if(pB->Message==PBT_POWERINFOCHANGE)

{

//在这里处理一些电池信息相关数据改变的事情

// MessageBox(NULL,L"Battery info change",NULL,NULL);

NKDbgPrintfW(L"[Fred]Battery info change BatteryLifePercent=%d\r\n",ppbpi->bBatteryLifePercent);

}

if(pB->Message==PBT_POWERSTATUSCHANGE)

{

//在这里处理一些电源输入状态改变 (AC/Battery)的事情

//MessageBox(NULL,L"Power input change",NULL,NULL);

NKDbgPrintfW(L"[Fred]Power input change ACIN=%d\r\n",ppbpi->bACLineStatus);

}

}

}

}

}

void Init_PowerNotify()

{

NKDbgPrintfW(L"[Fred]Init_PowerNotify++\r\n");

MSGQUEUEOPTIONS options = {0};

DWORD dwErr;

options.dwSize = sizeof(MSGQUEUEOPTIONS);

options.dwFlags = 0;

options.dwMaxMessages = QUEUE_ENTRIES;

options.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_NAMELEN;

options.bReadAccess = TRUE;

hMsgQ = CreateMsgQueue(NULL, &options);

if(!hMsgQ)

{

dwErr=GetLastError();

NKDbgPrintfW(L"[Fred]CreateMsgQueue failed\r\n");

RETAILMSG(1, (TEXT("[Fred]CreateMessageQueue ERROR:%d\n"), dwErr));

return;

}

HANDLE hNotifications = RequestPowerNotifications(hMsgQ, POWER_NOTIFY_ALL); // Flags

if (!hNotifications) {

dwErr = GetLastError();

RETAILMSG(1, (TEXT("[Fred]RequestPowerNotifications ERROR:%d\n"), dwErr));

StopPowerNotifications(hMsgQ);

return;

}

CreateThread(NULL, 0, PowerChangeListen, NULL, 0, NULL);

NKDbgPrintfW(L"[Fred]Init_PowerNotify--\r\n");

}

//###############################################################################################

AP可以把上面的代码全部复制到自己的源码中,然后在初始化的时候调用一次Init_PowerNotify,之后就可以等待消息的发生(中文注释部分)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有