3

これは簡単な質問のように思えますが、どのように解決すればよいかわかりません。接続されたデバイスが USB 2 か 3 かを検出する方法に関する投稿をいくつか見ましたが、デバイスが接続されていない場合でも、USB 3 ポートが使用可能かどうかを知る必要があります。

解決策の 1 つは、レジストリの「SYSTEM\CurrentControlSet\Services」キーを調べて、既知の USB3 サービスの事前設定リストと比較することです。IOCTL 呼び出しのようなもっと正確なものがあることを期待していました。

C++ (推奨) または C# を実装できます。

助けてくれてありがとう。

4

2 に答える 2

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;
    }
于 2013-08-31T22:10:11.983 に答える
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 ドライバーがインストールされているかどうかを判断できます。

于 2013-09-03T06:11:39.543 に答える