6

私は 2 つの USB デバイス ID を持っていますUSB\VID_E4F1&PID_0661\00000115FA9CE7750000000000000000USB\VID_E4F1&PID_0661&MI_00\7&B5A5DDF&0&0000

デバイス #2 がデバイス #1 の直接の子であることを確認する方法 (物理的には、同じ USB 複合デバイスの異なる部分です)。

実際のシナリオでは、それらの多くが同じ USB コントローラーに接続されます。また、同一メーカー・同一機種の可能性もございます。そのため、VID、PIDWin32_USBControllerDeviceを確認できず、WMI クエリを使用してそれらが同じ USB コントローラーに接続されていることを確認できません。同じコントローラーに接続されているという事実だけでなく、親子関係を何らかの方法で確認する必要があります。

問題がある場合は、Windows 8+ のみをサポートする必要があります。

4

3 に答える 3

6

ここでは、 PnP 構成マネージャー APIが役に立ちます。

于 2014-09-24T20:23:01.460 に答える
4

新しい WinRT API を使用できる場合は、PnpObjectクラスと名前空間を確認する必要があります。

コード例を次に示します。

var propertiesToQuery = new List<string>() { 
    "System.ItemNameDisplay",
    "System.Devices.DeviceInstanceId",
    "System.Devices.Parent",
    "System.Devices.LocationPaths",
    "System.Devices.Children"
};

var id1 = @"USB\VID_E4F1&PID_0661\00000115FA9CE7750000000000000000";

var device1 = await PnpObject.FindAllAsync(PnpObjectType.Device, 
                                            propertiesToQuery, 
                                            "System.Devices.DeviceInstanceId:=\"" + id1 + "\"");

var id2 = @"USB\VID_E4F1&PID_0661&MI_00\7&B5A5DDF&0&0000";

var device2 = await PnpObject.FindAllAsync(PnpObjectType.Device, 
                                            propertiesToQuery, 
                                            "System.Devices.DeviceInstanceId:=\"" + id2 + "\"");


var parent1 = device1.Properties["System.Devices.Parent"] as string;
var parent2 = device2.Properties["System.Devices.Parent"] as string;

if (parent1 && parent1 == id2)
{
    WriteLine("Device 2 is parent of device 1");
}

if (parent2 && parent2 == id1)
{
    WriteLine("Device 11 is parent of device 2");
}

var child_ids = device1.Properties["System.Devices.Children"] as string[];

if (child_ids != null){
    foreach (var id in child_ids)
    {
        if (id == id2){
            WriteLine("Device 2 is child of device 1")
        }
    }
}

 child_ids = device2.Properties["System.Devices.Children"] as string[];

if (child_ids != null){
    foreach (var id in child_ids)
    {
        if (id == id1){
            WriteLine("Device 1 is child of device 2")
        }
    }
}

これで十分でない場合は、親/子パスを上または下に移動してみてください。

System.Devices.LocationPathsプロパティ (文字列の配列) を調べて、一方が他方のプレフィックスであるかどうかをテストすることもできます。

于 2017-06-15T08:27:14.123 に答える