设备选择器允许你在枚举设备时限制设备搜索,这有助于获取更相关的结果并提高系统的性能。
在大多数情况下,可以从设备堆栈获取设备选择器。 例如,对于通过 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_EQUAL 或 COP_NOTEQUAL指定 NULL。 这转换为没有值的属性,或者该值不存在。 在 AQS 中,使用空括号 [] 指定 NULL。
重要
使用 COP_VALUE_CONTAINS 和 COP_VALUE_NOTCONTAINS 运算符时,它们的行为方式与字符串和字符串数组不同。 对于字符串,系统将执行不区分大小写的搜索,以查看设备是否包含指示的字符串作为子字符串。 对于字符串数组,不会搜索子字符串。 使用字符串数组,将搜索该数组以查看它是否包含整个指定的字符串。 无法搜索字符串数组以查看数组中的元素是否包含子字符串。
如果无法创建一个 AQS 筛选器字符串来适当限定结果的范围,可以在收到结果后筛选结果。 但是,建议在提供给 Windows.Devices.Enumeration API 时,尽可能多地限制初始 AQS 筛选器字符串的结果。 这有助于提高应用程序的性能。
AQS 字符串示例
以下示例演示如何使用 AQS 语法来限制要枚举的设备。 所有这些筛选器字符串都与 DeviceInformationKind 配对,以创建完整的筛选器。 如果未指定类型,请记住默认类型 DeviceInterface。
当此筛选器与 DeviceInterface的 DeviceInformationKind 配对时,它将枚举包含音频捕获接口类且当前已启用的所有对象。 = 转换为 COP_EQUALS。
System.Devices.InterfaceClassGuid:="{2eef81be-33fa-4800-9670-1cd474972c3f}" AND
System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True
当此筛选器与 Device的 DeviceInformationKind 配对时,它将枚举至少具有一个 GenCdRom 硬件 ID 的所有对象。 ~~ 转换为 COP_VALUE_CONTAINS。
System.Devices.HardwareIds:~~"GenCdRom"
当此筛选器与 DeviceInformationKind 的 DeviceContainer配对时,它将枚举具有包含子字符串 Microsoft 的模型名称的所有对象。 ~~ 转换为 COP_VALUE_CONTAINS。
System.Devices.ModelName:~~"Microsoft"
当此筛选器与 DeviceInformationKind 的 DeviceInterface配对时,它将枚举名称以子字符串 Microsoft 开头的所有对象。 ~< 转换为 COP_STARTSWITH。
System.ItemNameDisplay:~<"Microsoft"
当此筛选器与 Device的 DeviceInformationKind 配对时,它将枚举 System.Devices.IpAddress 属性集的所有对象。 <>[] 转换为 COP_NOTEQUALS 与 NULL 值组合。
System.Devices.IpAddress:<>[]
当此筛选器与 Device的 DeviceInformationKind 配对时,它将枚举所有没有 System.Devices.IpAddress 属性集的对象。 =[] 转换为 COP_EQUALS 与 NULL 值组合。
System.Devices.IpAddress:=[]