生成设备选择器

设备选择器允许你在枚举设备时限制设备搜索,这有助于获取更相关的结果并提高系统的性能。

在大多数情况下,可以从设备堆栈获取设备选择器。 例如,可以将 GetDeviceSelector 用于通过 USB 发现的设备。 这些设备选择器返回高级查询语法 (AQS) 字符串。 有关 AQS 格式的更多详细信息,请参阅 以编程方式使用高级查询语法。

重要的 API

生成筛选器字符串

在某些情况下,需要枚举设备和提供的设备选择器不适用于你的方案。 设备选择器是一个 AQS 筛选器字符串,其中包含以下信息。 在创建筛选器字符串之前,需要知道有关要枚举的设备的某些关键信息。

使用 Windows.Devices.Enumeration API 时,通常会将设备选择器与你感兴趣的设备类型组合在一起。 设备类型的可用列表由 DeviceInformationKind 枚举定义。 这种因素组合有助于限制你感兴趣的设备可用的设备。 如果未指定 DeviceInformationKind,或者所使用的方法不提供 DeviceInformationKind 参数,则默认类型为 DeviceInterface

Windows.Devices.Enumeration API 使用规范 AQS 语法,但并非所有运算符都受支持。 有关构造筛选器字符串时可用的属性的列表,请参阅 设备信息属性

注意

构造 AQS 筛选器字符串时,不能使用使用 {GUID} PID 格式定义的自定义属性。 这是因为属性类型派生自已知属性名称。

下表列出了 AQS 运算符及其支持的参数类型。

操作员 支持的类型
COP_EQUAL String, boolean, GUID, UInt16, UInt32
COP_NOTEQUAL String, boolean, GUID, UInt16, UInt32
COP_LESSTHAN UInt16、UInt32
COP_GREATERTHAN UInt16、UInt32
COP_LESSTHANOREQUAL UInt16、UInt32
COP_GREATERTHANOREQUAL UInt16、UInt32
COP_VALUE_CONTAINS 字符串, 字符串数组, 布尔数组, GUID 数组, UInt16 数组, UInt32 数组
COP_VALUE_NOTCONTAINS 字符串, 字符串数组, 布尔数组, GUID 数组, UInt16 数组, UInt32 数组
COP_VALUE_STARTSWITH 字符串
COP_VALUE_ENDSWITH 字符串
COP_DOSWILDCARDS 不支持
COP_WORD_EQUAL 不支持
COP_WORD_STARTSWITH 不支持
COP_APPLICATION_SPECIFIC 不支持

可以为COP_EQUALCOP_NOTEQUAL指定 NULL。 这转换为没有值的属性,或者该值不存在。 在 AQS 中,可以使用空括号 [] 指定 NULL

重要

使用 COP_VALUE_CONTAINSCOP_VALUE_NOTCONTAINS 运算符时,它们的行为方式与字符串和字符串数组不同。 对于字符串,系统将执行不区分大小写的搜索,以查看设备是否包含指示的字符串作为子字符串。 对于字符串数组,不会搜索子字符串。 使用字符串数组,将搜索该数组以查看它是否包含整个指定的字符串。 无法搜索字符串数组以查看数组中的元素是否包含子字符串。

如果无法创建一个 AQS 筛选器字符串来适当限定结果的范围,可以在收到结果后筛选结果。 但是,建议尽可能多地将初始 AQS 筛选器字符串的结果限制为 Windows.Devices.Enumeration API。 这有助于提高应用程序的性能。

AQS 字符串示例

以下示例演示如何使用 AQS 语法来限制要枚举的设备。 所有这些筛选器字符串都与 DeviceInformationKind 配对以创建完整的筛选器。 如果未指定类型,请记住默认类型为 DeviceInterface

当此筛选器与 DeviceInterfaceDeviceInformationKind 配对时,它将枚举包含音频捕获接口类且当前已启用的所有对象。 = 转换为 COP_EQUALS。

System.Devices.InterfaceClassGuid:="{2eef81be-33fa-4800-9670-1cd474972c3f}" AND
System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True

当此筛选器与 DeviceInformationKind 配对时,它会枚举具有至少一个 GenCdRom 硬件 ID 的所有对象。 ~~ 转换为 COP_VALUE_CONTAINS。

System.Devices.HardwareIds:~~"GenCdRom"

当此筛选器与 DeviceContainerDeviceInformationKind 配对时,它将枚举具有包含子字符串Microsoft的模型名称的所有对象。 ~~ 转换为 COP_VALUE_CONTAINS。

System.Devices.ModelName:~~"Microsoft"

当此筛选器与 DeviceInterfaceDeviceInformationKind 配对时,它将枚举名称以子字符串Microsoft开头的所有对象。 ~< 转换为 COP_STARTSWITH。

System.ItemNameDisplay:~<"Microsoft"

当此筛选器与 DeviceInformationKind 配对时,它会枚举设置了 System.Devices.IpAddress 属性的所有对象。 <>[] 转换为结合了 NULL 值的 COP_NOTEQUALS

System.Devices.IpAddress:<>[]

当此筛选器与 DeviceInformationKind 配对时,它会枚举未设置 System.Devices.IpAddress 属性的所有对象。 =[] 转换为结合了 NULL 值的 COP_EQUALS。

System.Devices.IpAddress:=[]

另请参阅