3113|5

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

真诚的求助高手们!!!!!! [复制链接]

我想让电池电量显示在桌面上,就和手机屏幕上显示的电池电量一样.
我知道用下面这个API函数,但是他返加的是BOOL,
SYSTEM_POWER_STATUS_EX sysPowStatus;
GetSystemPowerStatusEx(&sysPowStatus,true)

怎么才能做到让他显示在对话框上呢.谢谢0-

最新回复

可以写得让我看明白点吗.  详情 回复 发表于 2007-6-11 11:49
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
//=================================================
=======================
//TITLE:
// EVC 获取电源属性
//AUTHOR:
// norains
//DATE:
// Tuesday 29-August-2006
//=================================================
=======================
在evc 中获取电源的属性不算太复杂,但在文档中却没有提及,所以当时在获取电源属性
时走了不少弯路.
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,那么就在使用备用电池,我们只需要关注电量
的百分比即可.
代码的结构如下:
void BeginSample()
{
......
//Create the thread for batter sampled
DWORD dwPwrThdID = 0;
g_hPwrThd = CreateThread(NULL,0,PowerThread,NULL,0,&dwPwrThdID);
......
}
DWORD WINAPI PowerThread(PVOID pArg)
{
__try
{
BYTE pbMsgBuf[sizeof(POWER_BROADCAST) +
sizeof(POWER_BROADCAST_POWER_INFO)];
PPOWER_BROADCAST ppb = (PPOWER_BROADCAST) pbMsgBuf;
MSGQUEUEOPTIONS msgopts;
// Create our message queue
memset(&msgopts, 0, sizeof(msgopts));
msgopts.dwSize = sizeof(msgopts);
msgopts.dwFlags = 0;
msgopts.dwMaxMessages = 0;
msgopts.cbMaxMessage = sizeof(pbMsgBuf);
msgopts.bReadAccess = TRUE;
HANDLE rghWaits[1] = { NULL };
rghWaits[0] = CreateMsgQueue(NULL, &msgopts);
if (!rghWaits[0])
{
//erro
return 0x10;
}
HANDLE hReq = NULL;
// Request notifications
hReq = RequestPowerNotifications(rghWaits[0], PBT_POWERINFOCHANGE);
if (!hReq)
{
CloseHandle( rghWaits[ 0 ] );
//erro
return 0x15;
}
while(TRUE)
{
DWORD dwWaitCode = MsgWaitForMultipleObjectsEx( 1, rghWaits,
INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE );
if ( dwWaitCode == WAIT_OBJECT_0 )
{
DWORD dwSize, dwFlags;
if (ReadMsgQueue(rghWaits[0], ppb, sizeof(pbMsgBuf), &dwSize, 0,
&dwFlags))
{
UpdatePower(ppb);
}
else
{
return 0x20; // We should never get here
}
}
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
}
return 0;
}
void UpdatePower(PPOWER_BROADCAST pPowerInfo)
{
if ( !pPowerInfo )
{
DEBUGMSG(1,(L"pPowerInfo is empty\r\n"));
return;
}
PPOWER_BROADCAST_POWER_INFO ppbpi =
(PPOWER_BROADCAST_POWER_INFO) pPowerInfo->SystemPowerState;
if ( !ppbpi )
{
DEBUGMSG(1,(L"ppbpi is empty\r\n"));
return;
}
static BOOL bFirstTime = TRUE;
RECT rc = {IMG_PWR_X,IMG_PWR_Y,IMG_PWR_CX,IMG_PWR_CY};
if(ppbpi->bACLineStatus == AC_LINE_ONLINE)
{
if(ppbpi->bBatteryFlag == BATTERY_FLAG_CHARGING)
{
//Charging
......
}
else
{
//May be full charging
......
}
}
else
{
//Use battery
if(0 <= ppbpi->bBatteryLifePercent && ppbpi->bBatteryLifePercent <= 20)
{
.......
}
......
}
}
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
高手大哥,你好,真的希望你能把步骤说详细点,你那很多省略号是处理什么的,
愿意多出分给你,只要能成功,先在这里谢谢了.我搞了好几天都搞不定.
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(初级)

4
 
xuexi
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

5
 
省略号部分都是你自己的程序要做的事情,与本身程序无关,就像你用MFC建立的函数中间什么都没有一样.
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
可以写得让我看明白点吗.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表