生成设备选择器

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

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

重要的 API

生成筛选器字符串

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

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

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

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

注意

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

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

操作员 支持的类型
COP_EQUAL 字符串、布尔值、GUID、UInt16、UInt32
COP_NOTEQUAL 字符串、布尔值、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

当此筛选器与 DeviceDeviceInformationKind 配对时,它将枚举所有具有至少一个 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"

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

System.Devices.IpAddress:<>[]

当此筛选器与 DeviceDeviceInformationKind 配对时,它将枚举所有不具有 System.Devices.IpAddress 属性集的对象。 =[] 转换为结合了 NULL 值的 COP_EQUALS。

System.Devices.IpAddress:=[]

另请参阅