首页 > windows如何查看新插入U盘的盘符(已解决)

windows如何查看新插入U盘的盘符(已解决)

需求如题所示

现在通过监听WM_DEVICECHANGE消息能够知道什么时候插入/拔出了U盘,测试代码中打印出的信息:

Adding USB\VID_0951&PID_1642\001CC0EC32BCAD103712367C
Adding USBSTOR\DISK&VEN_KINGSTON&PROD_DT_101_G2&REV_1.00\001CC0EC32BCAD103712367C&0
Removing USBSTOR\DISK&VEN_KINGSTON&PROD_DT_101_G2&REV_1.00\001CC0EC32BCAD103712367C&0
Removing USB\VID_0951&PID_1642\001CC0EC32BCAD103712367C

如何通过这些信息取得系统分配给U盘的盘符。

我正在查,但告诉我相关的API能节省我一些时间,谢谢。


已解决,更新

解决的方法是接收到WM_DEVICECHANGE消息后,进行如下处理:

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;
            char driverLabel = FirstDriveFromMask(pDevVolume->dbcv_unitmask);
            if (wParam == DBT_DEVICEARRIVAL) {
                printf("add %c\r\n", driverLabel);
            } else {
                printf("remove %c\r\n", driverLabel);
            }
        }
    }
    return 0;
}

以前写过类似东西的顺便说一句,
监听消息之外……其实这玩意用WMI会更方便一些,主要是不依赖GUI了。。

        public void ControlUSBConnectionStatu()
        {
            try
            {
                getEventQuery = new WqlEventQuery("Select * from Win32_VolumeChangeEvent");
                getEventWatcher = new ManagementEventWatcher(getEventQuery);
                getEventWatcher.EventArrived += new EventArrivedEventHandler(getEventWatcher_EventArrived);
               getEventWatcher.Start();
            }
            catch (Exception se)
            { }
        }
        void getEventWatcher_EventArrived(object sender, EventArrivedEventArgs e)
        {
            if (work == null) return;
            ManagementBaseObject mbo = e.NewEvent;
            switch ((UInt16)mbo["EventType"])
            {
                case 2: // 插入
                    mbo["DriveName"] // 这个就是了
                case 3: // 弹出
            }
        }

【热门文章】
【热门文章】