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

发布于 2022-08-28 11:02:14 字数 2427 浏览 26 评论 0

需求如题所示

现在通过监听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: // 弹出
            }
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文