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

时间:2010-06-16 07:34:30

标签: c# winapi wmi windows-scripting

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

2 个答案:

答案 0 :(得分:2)

通过注册设备更改通知从任何窗口句柄捕获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");
                }
            }
        ....

答案 1 :(得分:1)

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

实际上,请查看here以获得更好的说明,并为您提供一个很好的课程。