WINCE接收設備插入拔出消息

在WINCE系統中,可以通過由窗口接收一個事件來判斷有新設備插入。
窗口只需要接收該消息:WM_DEVICECHANGE。然後,通過判斷設備類型和設備名稱就可以判斷具體的設備插入。
例如判斷 SD卡的插入和拔出操作,其中SD卡的設備名爲"DSK1:",那麼可以在頂層窗口中接收並判斷此消息:
case WM_DEVICECHANGE:
{

         DEV_BROADCAST_HDR* dhr = (DEV_BROADCAST_HDR *)lParam;
         PDEV_BROADCAST_PORT lpdbp = (PDEV_BROADCAST_PORT)dhr; 

         if( DBT_DEVTYP_PORT == lpdbp->dbcp_devicetype && !wcsicmp(lpdbp->dbcp_name, L"DSK1:")) {
                   switch(wParam) {
                               case DBT_DEVICEARRIVAL: //SD卡插入
                                          m_Flag_SD_Detected = TRUE;
                                          break;
                              case DBT_DEVICEREMOVECOMPLETE://SD卡拔出
                                          m_Flag_SD_Detected = FALSE;
                                          break;
                  }
          }
}
當然了,這個消息的發送也是要驅動程序去實現的。一般在驅動程序中有對設備在線和離線狀態的判斷,一旦發現狀態有變,就會廣播一個消息,也可以只往某個窗口發送消息。以下是USB從機驅動判斷插入和拔出的廣播消息的實現:
static VOID BroadcastUSBINSERT(
                     LPTSTR DevName,
                     BOOL bNew
)
{
          PDEV_BROADCAST_PORT pBCast;
          DWORD len;
          LPTSTR str;
         static DWORD insert_times = 0; //記錄USB插入的次數
         if(bNew == TRUE){
                  insert_times++;
         }else if(insert_times <= 0){
                 return;
         }else{
                insert_times = 0;
         }
        len = sizeof(DEV_BROADCAST_HDR) + (_tcslen(DevName) + 1)*sizeof(TCHAR);
        pBCast = (PDEV_BROADCAST_PORT)LocalAlloc(LPTR, len);
        if (pBCast == NULL) {
                return;
        }
        pBCast->dbcp_devicetype = DBT_DEVTYP_PORT;
        pBCast->dbcp_reserved = 0;
        str = (LPTSTR)&(pBCast->dbcp_name[0]);
        _tcscpy(str, DevName);
         pBCast->dbcp_size = len;
         DEBUGMSG(ZONE_PNP,
                                 (TEXT("DEVICE!BroadcastDeviceChange Calling SendNotifyMessage for device %s\r\n"), DevName));
         NKDbgPrintfW((TEXT("Sendmsg : %s\r\n")),(bNew)?TEXT("enter"):TEXT("exit"));
        // Call the function
        SendNotifyMessage(
                   HWND_BROADCAST,
                  WM_DEVICECHANGE,
                  (bNew) ? DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE,
                  (LPARAM)pBCast);
        LocalFree(pBCast);
}
這樣,用剛開始的辦法,在窗口中接收WM_DEVICECHANGE消息就可以進行異步判斷USB設備插入和拔出的動作了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章