我知道usb插入拔出会响应WM_DEVICECHANGE这个消息,但只能检测到DBT_DEVNODES_CHANGED,并不能检测到DBT_DEVICEARRIVAL,到底怎么回事?怎么解决呢?

解决方案 »

  1.   

    //没道理,可以收到DBT_DEVICEARRIVAL的。
    #include <windows.h>
    #include <dbt.h>void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam);
    char FirstDriveFromMask (ULONG unitmask);  //prototype/*------------------------------------------------------------------
       Main_OnDeviceChange (hwnd, wParam, lParam)   Description
          Handles WM_DEVICECHANGE messages sent to the application's
          top-level window.
    --------------------------------------------------------------------*/void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
    {
       PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
       char szMsg[80];   switch(wParam)
       {
          case DBT_DEVICEARRIVAL:
             // Check whether a CD or DVD was inserted into a drive.
             if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
             {
                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;            if (lpdbv -> dbcv_flags & DBTF_MEDIA)
                {
                   wsprintf (szMsg, "Drive %c: Media has arrived.\n",
                             FirstDriveFromMask(lpdbv ->dbcv_unitmask));               MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
                }
             }
             break;      case DBT_DEVICEREMOVECOMPLETE:
             // Check whether a CD or DVD was removed from a drive.
             if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
             {
                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;            if (lpdbv -> dbcv_flags & DBTF_MEDIA)
                {
                   wsprintf (szMsg, "Drive %c: Media was removed.\n",
                             FirstDriveFromMask(lpdbv ->dbcv_unitmask));               MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
                }
             }
             break;      default:
               /*
                  Process other WM_DEVICECHANGE notifications for other 
                  devices or reasons.
               */ 
                ;
       }
    }/*------------------------------------------------------------------
       FirstDriveFromMask (unitmask)   Description
         Finds the first valid drive letter from a mask of drive letters.
         The mask must be in the format bit 0 = A, bit 1 = B, bit 3 = C, 
         etc. A valid drive letter is defined when the corresponding bit 
         is set to 1.   Returns the first drive letter that was found.
    --------------------------------------------------------------------*/char FirstDriveFromMask (ULONG unitmask)
    {
       char i;   for (i = 0; i < 26; ++i)
       {
          if (unitmask & 0x1)
             break;
          unitmask = unitmask >> 1;
       }   return (i + 'A');
    }
      

  2.   

    谢谢楼上的,但坦白说,它就是根本进入不了这句话case DBT_DEVICEARRIVAL:
    我用买来的u盘是能检测到,但是用本公司做的usb电视卡就是检测不到
      

  3.   

    你用了RegisterDeviceNotification么?
      

  4.   

    请问RegisterDeviceNotification这个函数是不是在写驱动的时候用上啊?