首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找USB集线器的特定插槽号(10个插槽),其中USB是否连接。我想要一个特定的插槽,无论是否连接USB。

查找USB集线器的特定插槽号(10个插槽),其中USB是否连接。我想要一个特定的插槽,无论是否连接USB。
EN

Stack Overflow用户
提问于 2017-05-29 06:58:16
回答 2查看 1.4K关注 0票数 1

我有一个由10个USB插槽连接到我的USB端口的USB集线器。我想让USB设备连接到特定的端口。

例:两个USB连接在插槽3和插槽7。所以,我想要一个列表,显示插槽3和插槽7有USB和rest插槽是空的。

我尝试过使用WMI查询Win32_USBHub。但在这里,我只得到6个设备ID,而不是10个。我使用用于设备ID的公共VID来区分端口。

但即使在USB连接到特定端口之后。我想得到它们连接到USBHub的相应插槽。

我无法识别USB连接的插槽和插槽是空的。

代码语言:javascript
运行
复制
ManagementObjectCollection collection;
var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub");
collection = searcher.Get();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-29 07:17:27

我会尝试从USB设备中提取(与设备管理器中的相同).我不使用C#WMI编写代码,但是您应该能够使用作为winapi一部分的setupapi.h获得此类信息,我认为这是在C++/VCL中这样做的。

代码语言:javascript
运行
复制
#include <setupapi.h>
bool USBinfo()
    {
    int i,n;
    AnsiString s,txt="";
    DWORD dwSize,dwPropertyRegDataType;
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    TCHAR szDesc[1024];

    // List all connected USB devices
    hDevInfo = SetupDiGetClassDevs(NULL, TEXT("USB"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);
    if (hDevInfo == INVALID_HANDLE_VALUE) return false;
    for (i=0;;i++)
        {
        DeviceInfoData.cbSize = sizeof(DeviceInfoData);
        if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData)) break;
        SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
        s=szDesc; n=48; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" "; // this just set constant string size to allign the columns to n chars
        SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
        s=szDesc; if (s=="USB\\VID_????&PID_????REV_????")
            {
            // here you can do custom stuff for specific VID,PID just change the ???? in above line to your specific VID,PID,REV
            }
        s=szDesc; n=64; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
        SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_LOCATION_INFORMATION,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
        s=szDesc; n=64; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
        txt+="\r\n";
        }
    Main->mm_log->Lines->Add(txt); // this just output txt string to memo
    return true;
    }

这里的输出在我的机器上:

代码语言:javascript
运行
复制
USB Root Hub                                     USB\ROOT_HUB&VID1022&PID7807&REV0011                             USB\ROOT_HUB&VID1022&PID7807&REV0011                             
USB Root Hub                                     USB\ROOT_HUB&VID1022&PID7807&REV0011                             USB\ROOT_HUB&VID1022&PID7807&REV0011                             
USB Root Hub                                     USB\ROOT_HUB&VID1022&PID7809&REV0011                             USB\ROOT_HUB&VID1022&PID7809&REV0011                             
USB Root Hub                                     USB\ROOT_HUB20&VID1022&PID7808&REV0011                           USB\ROOT_HUB20&VID1022&PID7808&REV0011                           
USB Root Hub                                     USB\ROOT_HUB20&VID1022&PID7808&REV0011                           USB\ROOT_HUB20&VID1022&PID7808&REV0011                           
USB Composite Device                             USB\VID_048D&PID_9006&REV_0200                                   Port_#0001.Hub_#0004                                             
IT9135 BDA Device                                USB\VID_048D&PID_9006&REV_0200&MI_00                             0000.0013.0002.001.000.000.000.000.000                           
USB Input Device                                 USB\VID_048D&PID_9006&REV_0200&MI_01                             0000.0013.0002.001.000.000.000.000.000                           
Canon LiDE 30                                    USB\VID_04A9&PID_220E&REV_0100                                   Port_#0005.Hub_#0001                                             
American Power Conversion USB UPS                USB\VID_051D&PID_0002&REV_0106                                   Port_#0001.Hub_#0001                                             
USB Input Device                                 USB\Vid_093A&Pid_2510&Rev_0100                                   USB Optical Mouse                                                
USB Input Device                                 USB\VID_413C&PID_2107&REV_0115                                   Port_#0002.Hub_#0001                                             

如您所见,最后一列(第3列)包含您想要的信息。查看setupapi.h内部的所有SPDRP_定义您可以使用..。VCL中唯一使用的是AnsiString,因此将其更改为您可以使用的任何字符串类型。

这并不局限于USB。如果您想要所有设备,那么将TEXT("USB")搜索参数更改为NULL

代码语言:javascript
运行
复制
hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);
票数 0
EN

Stack Overflow用户

发布于 2020-08-19 08:34:19

代码语言:javascript
运行
复制
static int GetPhysicalPort()
    {
        try
        {
            devices = new List<USBDeviceInfo>();
            
            ManagementObjectCollection collection;
            using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnPSignedDriver WHERE DeviceId LIKE 'USB\\VID%' AND Description = 'USB Mass Storage Device' "))
            {
                collection = searcher.Get();
                searcher.Dispose();
            }
                

            foreach (var device in collection)
            {
                devices.Add(new USBDeviceInfo(
                (string)device.GetPropertyValue("DeviceId"),
                (string)device.GetPropertyValue("Description"),
                (string)device.GetPropertyValue("Location")
                ));
            }

            collection.Dispose();
           
            string LastAdded = devices[0].Location.Substring(6, 4);
            Console.WriteLine(LastAdded);
            return Convert.ToInt32(LastAdded);
        }

        catch (Exception e)
        {
            Console.WriteLine(e);
            return 0;
        }
    }


 class USBDeviceInfo
{
    public USBDeviceInfo(string deviceID, string Description, string location)
    {
        this.DeviceID = deviceID;
        this.Desc = Description;
        this.Location = location;
        
       
    }
    public string DeviceID   { get;}
    public string  Desc      { get;}
    public string Location   { get;}
}

我正在用这个方法来获取你想要的插槽。事实上,由于我的要求,我选择了最后一个插入USB的插槽。您只需调试并查看类USBDeviceInfo的内容,然后将其用于您自己的目的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44236310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档