关于网友提出的“windows如何查看新插入U盘的盘符已解决”问题疑问,本网通过在网上对“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: // 弹出
}
}
以上介绍了“windows如何查看新插入U盘的盘符已解决”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1156168.html