【问题标题】:Getting USB Storage Device Instance ID (unique ID) programmatically以编程方式获取 USB 存储设备实例 ID(唯一 ID)
【发布时间】:2010-06-16 07:34:29
【问题描述】:

如何以编程方式获取用户刚刚插入的 USB 大容量存储设备的设备实例 ID(唯一 ID)?

【问题讨论】:

    标签: c# winapi wmi windows-scripting device-instance-id


    【解决方案1】:

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

    【讨论】:

    • lParam of WM_DEVICECHANGE,可能会或可能不会转换为 DBT_DEVTYP_DEVICEINTERFACE。这取决于wParam。例如。如果 wparam 是 DBT_DEVICEARRIVALDBT_DEVICEREMOVECOMPLETE,则可以强制转换,但如果是 DBT_DEVNODES_CHANGED,则不能。对于DBT_DEVNODES_CHANGED 的情况,lParam 始终为zero
    【解决方案2】:

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

    实际上,请查看here 以获得更好的说明和为您做的漂亮课程。

    【讨论】:

    • 但是我想找到一个新插入的设备的设备实例ID。当时我不知道那个新插入的设备的驱动器号。如果用户已经插入了两支或三支笔怎么办开车到系统,现在他正在插入另一个设备。
    • @Navaneeth:查看ManagementEventWatcher 类和“DiskEventArrived”事件。此代码应向您显示结构:eggheadcafe.com/software/aspnet/31850441/…
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2011-11-15
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多