用win32 API监听U盘插拔并取得其盘符/取得当前插入U盘的盘符

时间:2022-02-04 04:36:26

用win32 API监听U盘插拔并取得其盘符

1.使用RegisterDeviceNotification()函数注册

[cpp]  

 

static const GUID GUID_DEVINTERFACE_USB_DEVICE =   

    {0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}};  

  

void RegisterDeviceNotify()  

{  

    HDEVNOTIFY hDevNotify;  

    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;  

    ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );  

    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);  

    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;  

    NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;  

    hDevNotify = RegisterDeviceNotification(hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);  

}  


2.在WndProc()函数中接收WM_DEVICECHANGE消息

[cpp]  

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  

{  

    switch(message)  

    {  

    case WM_DEVICECHANGE:  

        return DeviceChange(message, wParam, lParam);  

    }  

  

    return DefWindowProc(hWnd, message, wParam, lParam);  

}  


3.处理接收到的WM_DEVICECHANGE消息

[cpp]  

 

char FirstDriveFromMask(ULONG unitmask)  

{  

   char i;  

  

   for (i = 0; i < 26; ++i)  

   {  

      if (unitmask & 0x1)  

         break;  

      unitmask >>= 1;  

   }  

  

   return (i + ‘A‘);  

}  

  

LRESULT DeviceChange(UINT message, WPARAM wParam, LPARAM lParam)  

{  

    if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam )   

    {  

        PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;  

        if (pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)   

        {  

            PDEV_BROADCAST_VOLUME pDevVolume = (PDEV_BROADCAST_VOLUME)lParam;