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

发布于 2024-09-05 11:21:20 字数 51 浏览 8 评论 0原文

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

How to programmatically get the Device Instance ID (unique ID) of a USB mass storage device that a user just plugged in?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

渔村楼浪 2024-09-12 11:21:20

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

Catch WM_DEVICECHANGE from any window handle by registering for device change notifications. As such:

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);

The lParam of the WM_DEVICECHANGE can be cast to DBT_DEVTYP_DEVICEINTERFACE. Note - when plug in a device you may get multiple WM_DEVICECHANGE notifications. Just filter on the arrival event and ignore duplicates.

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");
                }
            }
        ....
糖粟与秋泊 2024-09-12 11:21:20

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

实际上,请查看此处以获取更好的说明和一个不错的课程,可以为您做到这一点。

I think you can do it using WMI. Look at the Win32_LogicalDiskToPartition class to get a list of all disk names and then use those names to query the class Win32_DiskDrive and it's PNPDeviceID property.

Actually, look here for better instructions and a nice class that does it for you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文