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: // 弹出
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论