wince 休眠之前会接收到PBT_TRANSITION通知,但是接收不到POWER_STATE_SUSPEND通知?
唤醒之后可以接收到PBT_TRANSITION,PBT_RESUME通知。
void IlockDThreadProc(void)
{
MSGQUEUEOPTIONS mqo;
HANDLE hPowerMsgQ;
HANDLE hPowerNotifications;
DWORD cbRead;
DWORD dwFlags;
DWORD cbPowerMsgSize = PM_BROADCAST_QUEUE_SIZE;
DWORD dwPwrFlags;
TCHAR szPowerState[32];
POWER_BROADCAST ppb;
union {
WCHAR buf[PM_BROADCAST_QUEUE_SIZE];
POWER_BROADCAST powerBroadcast;
} u;
mqo.dwFlags = 0;
mqo.dwMaxMessages = 20;
mqo.cbMaxMessage = 50;
mqo.bReadAccess = true;
mqo.dwSize = sizeof(MSGQUEUEOPTIONS);
hPowerMsgQ = CreateMsgQueue(NULL, &mqo);
if (NULL == hPowerMsgQ) {
printf("\r\nCreateMsgQueue failed: %x\r\n", GetLastError());
goto Error;
}
hPowerNotifications = RequestPowerNotifications(hPowerMsgQ,POWER_NOTIFY_ALL);//);
if (NULL == hPowerNotifications)
{
printf("RequestPowerNotifications failed: %x\r\n", GetLastError());
goto Error;
}
while(1){
WaitForSingleObject(hPowerMsgQ, INFINITE);
if (!ReadMsgQueue(hPowerMsgQ, &u, cbPowerMsgSize, &cbRead, 0, &dwFlags))
{
printf("ReadMsgQueue failed: %x\r\n", GetLastError());
ASSERT(FALSE);
}
ppb = u.powerBroadcast;
switch(ppb.Message)
{
case PBT_TRANSITION:
break;
case PBT_RESUME:
break;
case PBT_POWERSTATUSCHANGE:
break;
case POWER_STATE_SUSPEND:
//休眠没进来
break;
case PBT_POWERINFOCHANGE:
break;
default:
break;
}
}
Error:
if (hPowerMsgQ)
CloseMsgQueue(hPowerMsgQ);
if (hPowerNotifications)
StopPowerNotifications(hPowerNotifications);
}
------解决思路----------------------
没有 POWER_STATE_SUSPEND 信息,可能是电源部分的驱动工程修改了相关的代码,导致无此消息。
此部分是 OEM 可定制的,不是说一定有的。如果驱动开发人员不按标准实现,UI 就得不到相关的消息。