以编程方式获取USB存储设备实例ID(唯一ID)

问题描述:

每当用户插入USB大容量存储设备时,如何以编程方式获取该特定设备的设备实例ID(唯一ID)?以编程方式获取USB存储设备实例ID(唯一ID)

通过注册设备更改通知从任何窗口句柄中捕获WM_DEVICECHANGE。因此:

DEV_BROADCAST_DEVICEINTERFACE dbd = { sizeof(dbd) }; 
dbd.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
dbd.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE; 
RegisterDeviceNotification(hwnd, &dbd, DEVICE_NOTIFY_WINDOW_HANDLE); 

的WM_DEVICECHANGE的lParam的可以转换为DBT_DEVTYP_DEVICEINTERFACE。注意 - 插入设备时,您可能会收到多个WM_DEVICECHANGE通知。只需在抵达事件过滤并忽略重复。

LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(hwnd) 
    { 
     case WM_DEVICE_CHANGE: 
     { 
      PDEV_BROADCAST_HDR pHdr = NULL; 
      PDEV_BROADCAST_DEVICEINTERFACE pDev = NULL; 
      pHdr = (PDEV_BROADCAST_HDR)lParam; 
      bool fDeviceArrival = (wParam == DBT_DEVICEARRIVAL); 
      if (fDeviceArrival) 
      { 
       if (pHdr && (pHdr->dbch_devicetype==DBT_DEVTYP_DEVICEINTERFACE)) 
       { 
        pDev = (PDEV_BROADCAST_DEVICEINTERFACE)lParam; 
       } 
       if (pDev && (pDev->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE)) 
       { 
        // the PNP string of the device just plugged is in dbcc_name 
        OutputDebugString(pDev->dbcc_name); 
        OutputDebugString("\r\n"); 
       } 
      } 
     .... 
+0

'WM_DEVICECHANGE'的'lParam',可能或不会被转换为' DBT_DEVTYP_DEVICEINTERFACE'。这取决于'wParam'。例如。如果wparam是'DBT_DEVICEARRIVAL'或'DBT_DEVICEREMOVECOMPLETE',则可以投射,但当它是'DBT_DEVNODES_CHANGED'时不会投射。对于'DBT_DEVNODES_CHANGED'的情况,''lParam'总是'零'。 – 2017-10-11 12:16:51

我想你可以用WMI来做。查看Win32_LogicalDiskToPartition类以获取所有磁盘名称的列表,然后使用这些名称查询类Win32_DiskDrive及其PNPDeviceID属性。

其实,看看here为更好的指示和一个很好的类,它为你做。

+0

但我想找到的device.At新插入的设备实例ID那个时候我不知道,新插入device.And器的盘符是什么,如果用户插入媒体链接两三笔驱动器该系统现在他正在插入另一个设备。 – Navaneeth 2010-06-16 08:18:48

+0

@Navaneeth:看看'ManagementEventWatcher'类和'DiskEventArrived'事件。这段代码应该会显示出结构:http://www.eggheadcafe.com/software/aspnet/31850441/c-usb-pluginremoval-h.aspx – 2010-06-16 08:37:58