生成设备选择器

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

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

重要的应用程序接口(API)

生成筛选器字符串

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

  • 你感兴趣设备的 设备信息类型。 有关 DeviceInformationKind 如何影响枚举设备的详细信息,请参阅 枚举设备
  • 如何生成 AQS 筛选器字符串(本主题中所述)。
  • 你感兴趣的属性。 可用属性将取决于 DeviceInformationKind。 有关详细信息,请参阅 设备信息属性
  • 您正在查询的协议。 仅当通过无线或有线网络搜索设备时,才需要这样做。 有关如何执行此操作的更多信息,请参阅 通过网络枚举设备

使用 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_小于或等于 UInt16、UInt32
大于或等于 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_EQUALCOP_NOTEQUAL指定 NULL。 这转换为没有值的属性,或者该值不存在。 在 AQS 中,使用空括号 [] 指定 NULL

重要

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

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

AQS 字符串示例

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

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

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

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

System.Devices.HardwareIds:~~"GenCdRom"

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

System.Devices.ModelName:~~"Microsoft"

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

System.ItemNameDisplay:~<"Microsoft"

当此筛选器与 DeviceDeviceInformationKind 配对时,它将枚举 System.Devices.IpAddress 属性集的所有对象。 <>[] 转换为 COP_NOTEQUALSNULL 值组合。

System.Devices.IpAddress:<>[]

当此筛选器与 DeviceDeviceInformationKind 配对时,它将枚举所有没有 System.Devices.IpAddress 属性集的对象。 =[] 转换为 COP_EQUALSNULL 值组合。

System.Devices.IpAddress:=[]

另请参阅