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