如何以编程方式检测PC是否具有USB3功能?

时间:2013-08-21 20:07:30

标签: c++ windows usb

这似乎应该是一个简单的问题,但我不确定如何最好地解决它。我已经看过一些关于如何检测连接设备是USB 2还是3的帖子,但是我需要知道USB 3端口是否可用,即使没有连接任何设备。

一种解决方案是遍历“SYSTEM \ CurrentControlSet \ Services'密钥在注册表中,并与预先设定的已知USB3服务列表进行比较。我希望有一些像IOCTL电话更准确的东西。

我可以实现C ++(首选)或C#。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

以下是我实现此方法的方法。不是我正在寻找的解决方案。这基本上会告诉我系统上是否有USB 3.0驱动程序。它不会检测系统上的硬件是否包含USB 3.0端口。更喜欢C ++中较低级别的东西。

如果有人能告诉我如何检测硬件(而不仅仅是炉渣而不是贡献),我将不胜感激。谢谢!

    private bool IsUsb3()
    {
        string val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\USBXHCI", "ImagePath", 0);
        if (val != null) return true;   // Microsoft
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\USBHUB3", "ImagePath", 0);
        if (val != null) return true;   // Microsoft
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\usb3Hub", "ImagePath", 0);
        if (val != null) return true;   // Microsoft
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\UCX01000", "ImagePath", 0);
        if (val != null) return true;   // Microsoft
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\nusb3hub", "ImagePath", 0);
        if (val != null) return true;   // Renesas
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\nusb3xhc", "ImagePath", 0);
        if (val != null) return true;   // Renesas
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\iusb3xhc", "ImagePath", 0);
        if (val != null) return true;   // Intel
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\iusb3hub", "ImagePath", 0);
        if (val != null) return true;   // Intel
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\iusb3hcs", "ImagePath", 0);
        if (val != null) return true;

        return false;
    }

答案 1 :(得分:0)

这正是我所寻找的:

http://read.pudn.com/downloads105/sourcecode/windows/vxd/432626/USBLib/USB.cs__.htm

然后我添加了以下代码:

        // Get USB information
        bool supportsUsb3 = false;
        System.Collections.ObjectModel.ReadOnlyCollection<USB.USBController> hostlist = null;
        hostlist = USB.GetHostControllers();
        mControllerCount = hostlist.Count;

        foreach (USB.USBController host in hostlist)
        {
            USB.USBController controller = new USB.USBController();
            controller.ControllerDevicePath = host.ControllerDevicePath;
            USB.USBHub roothub = controller.GetRootHub();

            System.Collections.ObjectModel.ReadOnlyCollection<USB.USBPort> portlist = null;
            portlist = roothub.GetPorts();
            foreach (USB.USBPort port in portlist)
            {
                USB.USBHub hub = port.GetHub();
                if (port.PortSpeed == USBLib.USB.USB_DEVICE_SPEED.UsbSuperSpeed.ToString())
                {
                    supportsUsb3 = true;
                    break;
                }
            }
            if (supportsUsb3)
                break;
        }

我现在可以确定用户的PC是否有USB 3.0端口。如果它们只有2.0端口,那么我可以使用前面的代码来确定是否安装了USB 3驱动程序。