mobile上关于准确获取电量的问题?

金笛子 2010-01-20 06:45:31
mobile上关于准确获取电量的问题?
方案1.采用定时器的方式 每个1分钟 去 检查下
SYSTEM_POWER_STATUS_EX stat;
GetSystemPowerStatusEx(&stat, TRUE);
if (stat.BatteryLifePercent < 1)
{
。。。。。。。。。。。。。。。。。。。。。。。
}
这里根据BatteryLifePercent来划分电量,在机器上得到最大的电量是100
方案2.
采用监视注册表的方式:
hr = RegistryNotifyCallback(
SN_POWERBATTERYSTRENGTH_ROOT,
SN_POWERBATTERYSTRENGTH_PATH,
SN_POWERBATTERYSTRENGTH_VALUE,
BattStateCallback
WM_CHANGE_BATTSTRENGTH, // This notification uses a custom window message.
0,
&nc,
&g_hNotify[0]
);

if (FAILED(hr))
{
goto Error;
}

void UpdateBattStrength(HKEY hKey, LPCWSTR wszSubKey, LPCWSTR wszName, DWORD dwBitMask, int nControlID)
{
HRESULT hr;
DWORD dwRegValue;
ULONG dwBattStrength;
TCHAR szBattStrengthStr[STATUS_STRING_LEN];

StringCchCopy(szBattStrengthStr, STATUS_STRING_LEN, L"");

// Read the new value from the registry.
hr = RegistryGetDWORD(hKey, wszSubKey, wszName, &dwRegValue);

if (hr == S_OK)
{
// Get the value of the highword and shift the bits over to read the actual value.
dwBattStrength = (dwRegValue & dwBitMask) >> 24;

// Check the value to get the appropriate string.
if (dwBattStrength == 0)
{
StringCchCopy(szBattStrengthStr, STATUS_STRING_LEN, L"Very Low");
}
else if (dwBattStrength == 21)
{
StringCchCopy(szBattStrengthStr, STATUS_STRING_LEN, L"Low");
}
else if (dwBattStrength == 41)
{
StringCchCopy(szBattStrengthStr, STATUS_STRING_LEN, L"Medium");
}
else if (dwBattStrength == 61)
{
StringCchCopy(szBattStrengthStr, STATUS_STRING_LEN, L"High");
}
else if (dwBattStrength == 81)
{
StringCchCopy(szBattStrengthStr, STATUS_STRING_LEN, L"Very High");
}

}

// Update the status text.
SetDlgItemText(g_hCurWndDialog, nControlID, szBattStrengthStr);
}

如果采用这个方式从注册表里面分离出来的数据 感觉要不是 0 21 41 61 81

但是这个不符合要求 我想得到具体的数字

因为满格的时候,采用这个方式来处理得到的是81 而我想得到100,
如果采用这种监视注册表的方式来处理的话,如何准确得到电量呢?
...全文
243 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ropert911 2010-01-23
  • 打赏
  • 举报
回复
1.想要准确获取电池电量信息,建议还是用GetSystemPowerStatusEx
2.如果想随时知道电源状态(电量,电源使用状态的变化),RequestPowerNotifications方法建消息队列去得到电量消息。消息队列的使用:

MSGQUEUEOPTIONS msgopts; //建消息队列的设置
HANDLE hMsgQueue; //消息队列句柄
HANDLE hPowerNotify; //请示电源消息的句柄
HANDLE hEvents[2];
POWER_BROADCAST *ppb; //得到消息队列传过来的电源通知信息
BYTE abBuffer[POWERMSGSIZE]; //通知信息的缓存
DWORD dwByteRead; //得到的消息队列的数据的大小

msgopts.dwSize = sizeof(MSGQUEUEOPTIONS); //消息队列的大小
msgopts.dwFlags = MSGQUEUE_NOPRECOMMIT; //在读了消息之后清除这个消息
msgopts.dwMaxMessages = 10; //设置队列最大的消息数,设为0就是不限制
msgopts.cbMaxMessage = POWERMSGSIZE; //每一个消息的最大字节数,这里指定是电源消息的大小
msgopts.bReadAccess = TRUE; //真为可读,false为可写

hMsgQueue = CreateMsgQueue(NULL, &msgopts); //建立消息队列,第一个参数为消息队列的名字
if (hMsgQueue == NULL) //如果为空,建立失败
{}else
{
GetSystemPowerStatusEx(msgopts, PBT_POWERINFOCHANGE);
}

hEvents[0] = hMsgQueue; //消息队列句柄
hEvents[1] = m_hCloseThreadEvent; //结束事件的句柄

__try {
while ( (dwEventRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE)) != WAIT_FAILED )
{
if ( dwEventRet != WAIT_OBJECT_0 ) //如果不是电源通知事件,结束
{
StopPowerNotifications(hPowerNotify) //停止通知
break;
}
ppb = (POWER_BROADCAST *)abBuffer; //指向缓存
while (ReadMsgQueue(hMsgQueue, ppb, POWERMSGSIZE, &dwByteRead, 0, &dwFlags)) //POWERMSGSIZE, 指定缓存的大小, dwByteRead:得到的数据的字节大小
//读取超时时间。0:如果没有数据,不会堵塞。INFINITE:一直读,直到有数据。
//dwFlags得到消息队列的属性(MSGQUEUE_MSGALERT 指明是警告消息)
{//dosomething }
}
__except (EXCEPTION_EXECUTE_HANDLER)
{ throw;}

bsr2009 2010-01-22
  • 打赏
  • 举报
回复
个人也建议用GetSystemPowerStatusEx。
nzc123 2010-01-22
  • 打赏
  • 举报
回复
mark一下。
世外涛缘 2010-01-22
  • 打赏
  • 举报
回复
想要准确获取电池电量信息,建议还是用GetSystemPowerStatusEx吧。
kunmoblin 2010-01-22
  • 打赏
  • 举报
回复
mark
Jake_Lin 2010-01-22
  • 打赏
  • 举报
回复
GetSystemPowerStatusEx正解
xueyuxtmoon 2010-01-22
  • 打赏
  • 举报
回复
SYSTEM_POWER_STATUS_EX status;
GetSystemPowerStatusEx(&status, TRUE);
AugustFog 2010-01-21
  • 打赏
  • 举报
回复
这两种方法并不好,HANDLE RequestPowerNotifications(
HANDLE hMsgQ,
DWORD Flags
);
用这个方法,当电量有变化的时候,它就会发消息过来。具体参照帮助文档。
nihao38 2010-01-21
  • 打赏
  • 举报
回复
关注
kabing 2010-01-21
  • 打赏
  • 举报
回复
mark下
ppc_2008 2010-01-21
  • 打赏
  • 举报
回复
个人建议对于电量我们知道其范围就可以了,比如Very High:80-100 ,High:60-79.
也不知道你获取准确电量的具体意义。1楼的兄弟提供的方法你可以试试。
Hinagi 2010-01-21
  • 打赏
  • 举报
回复
[HKEY_LOCAL_MACHINE\System\State\Battery]

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧