C# 查找连接或未连接USB的USB集线器的特定插槽号(10个插槽)。我想得到的具体插槽没有USB连接或没有
我有一个10个USB插槽的USB集线器连接到我的USB端口。我想将USB设备连接到特定端口C# 查找连接或未连接USB的USB集线器的特定插槽号(10个插槽)。我想得到的具体插槽没有USB连接或没有,c#,.net,wmi,C#,.net,Wmi,我有一个10个USB插槽的USB集线器连接到我的USB端口。我想将USB设备连接到特定端口示例:两个USB连接在插槽3和插槽7处。所以,我想要一个列表,显示插槽3和插槽7有USB,其余插槽为空 我尝试过使用WMI查询Win32_USBHub。但这里我只得到6个设备ID,而不是10个。我使用设备ID的公共VID区分端口 但即使在将USB连接到特定端口后仍然如此。我想得到它们与USBHub连接的对应插槽 我无法识别USB连接的插槽以及插槽为空的位置 ManagementObjectCollectio
示例:两个USB连接在插槽3和插槽7处。所以,我想要一个列表,显示插槽3和插槽7有USB,其余插槽为空 我尝试过使用WMI查询Win32_USBHub。但这里我只得到6个设备ID,而不是10个。我使用设备ID的公共VID区分端口 但即使在将USB连接到特定端口后仍然如此。我想得到它们与USBHub连接的对应插槽 我无法识别USB连接的插槽以及插槽为空的位置
ManagementObjectCollection collection;
var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub");
collection = searcher.Get();
我会尝试从USB设备中提取
位置信息
(与设备管理器中相同)。。。我不在C#或WMI中编写代码,但您应该能够通过setupapi.h
获取此类信息,它是winapi的一部分(我想),我在C++/VCL中就是这样做的:
#包括
bool USBinfo()
{
inti,n;
AnsiString s,txt=“”;
DWORD dwSize,dwPropertyRegDataType;
HDEVINFO HDEVINFO;
SP_设备信息_数据设备信息数据;
TCHAR szDesc[1024];
//列出所有连接的USB设备
hDevInfo=SetupDiGetClassDevs(NULL,文本(“USB”),NULL,DIGCF_-PRESENT | DIGCF_-ALLCLASSES);
if(hDevInfo==无效的句柄值)返回false;
对于(i=0;i++)
{
DeviceInfo.cbSize=sizeof(DeviceInfo数据);
如果(!SetupDiEnumDeviceInfo(hdeInfo、i和DeviceInfo数据))中断;
SetupDiGetDeviceRegistrProperty(hdeInfo和DeviceInfo数据、SPDRP_DEVICEDESC和dwPropertyRegDataType,(字节*)szDesc、sizeof(szDesc)和dwSize);
s=szDesc;n=48;while(s.Length()n)s=s.SubString(1,n);txt+=s+“”;//这只是设置常量字符串大小以将列全部标记为n个字符
SetupDiGetDeviceRegistrProperty(hdeInfo和DeviceInfo数据、SPDRP_硬件ID和dwPropertyRegDataType,(字节*)szDesc、sizeof(szDesc)和dwSize);
s=szDesc;如果(s==“USB\\VID_???和PID_???REV_???”)
{
//在这里,你可以为特定的视频,PID做定制,只需将上面一行中的???更改为你的特定视频,PID,REV
}
s=szDesc;n=64;而(s.Length()n)s=s.SubString(1,n);txt+=s+“”;
SetupDiGetDeviceRegistrProperty(hdeInfo和DeviceInfo数据、SPDRP\u位置信息和dwPropertyRegDataType,(字节*)szDesc、sizeof(szDesc)和dwSize);
s=szDesc;n=64;而(s.Length()n)s=s.SubString(1,n);txt+=s+“”;
txt+=“\r\n”;
}
Main->mm_log->line->Add(txt);//这只是将txt字符串输出到memo
返回true;
}
这里是我机器上的输出:
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\uu
定义。。。从VCL使用的唯一东西是AnsiString
,因此将其更改为您可以使用的任何字符串类型
这不限于USB。如果需要所有设备,请将TEXT(“USB”)
search参数更改为NULL
hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);
我会尝试从USB设备中提取
位置信息
(与设备管理器中相同)。。。我不在C#或WMI中编写代码,但您应该能够通过setupapi.h
获取此类信息,它是winapi的一部分(我想),我在C++/VCL中就是这样做的:
#包括
bool USBinfo()
{
inti,n;
AnsiString s,txt=“”;
DWORD dwSize,dwPropertyRegDataType;
HDEVINFO HDEVINFO;
SP_设备信息_数据设备信息数据;
TCHAR szDesc[1024];
//列出所有连接的USB设备
hDevInfo=SetupDiGetClassDevs(NULL,文本(“USB”),NULL,DIGCF_-PRESENT | DIGCF_-ALLCLASSES);
if(hDevInfo==无效的句柄值)返回false;
对于(i=0;i++)
{
DeviceInfo.cbSize=sizeof(DeviceInfo数据);
如果(!SetupDiEnumDeviceInfo(hdeInfo、i和DeviceInfo数据))中断;
SetupDiGetDeviceRegistrProperty(hdeInfo和DeviceInfo数据、SPDRP_DEVICEDESC和dwPropertyRegDataType,(字节*)szDesc、sizeof(szDesc)和dwSize);
s=szDesc;n=48;while(s.Length()n)s=s.SubString(1,n);txt+=s+“”;//这只是设置常量字符串大小以将列全部标记为n个字符
SetupDiGetDeviceRegistrProperty(hdeInfo和DeviceInfo数据、SPDRP_硬件ID和dwPropertyRegDataType,(字节*)szDesc、sizeof(szDesc)和dwSize);
s=szDesc;如果(s==“USB\\VID_???和PID_???REV_???”)
{
//在这里,你可以为特定的视频,PID做定制,只需将上面一行中的???更改为你的特定视频,PID,REV
}
s=szDesc;n=64;而(s.Length()n)s=s.SubString(1,n);txt+=s+“”;
SetupDiGetDeviceRegistrProperty(hdeInfo和DeviceInfo数据、SPDRP\u位置信息和dwPropertyRegDataType,(字节*)szDesc、sizeof(szDesc)和dwSize);
s=szDesc;n=64;而(s.Length()n)s=s.SubString(1,n);txt+=s+“”;
txt+=“\r\n”;
}
Main->mm_log->line->Add(txt);//这只是将txt字符串输出到memo
返回true;
}
这里是我机器上的输出:
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\uu
定义。。。从VCL使用的唯一东西是AnsiString
,因此将其更改为您可以使用的任何字符串类型
这不限于USB。如果需要所有设备,请将TEXT(“USB”)
search参数更改为NULL
hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);
static int GetPhysicalPort()
{
尝试
{
设备=新列表();
管理对象收集;
U