当前位置: 代码迷 >> WinCE >> wince 休眠先期接收不到POWER_STATE_SUSPEND 状态通知
  详细解决方案

wince 休眠先期接收不到POWER_STATE_SUSPEND 状态通知

热度:349   发布时间:2016-04-28 11:51:56.0
wince 休眠之前接收不到POWER_STATE_SUSPEND 状态通知
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 就得不到相关的消息。
  相关解决方案