生成设备选择器
设备选择器允许你在枚举设备时限制要搜索的设备,这有助于获取更相关的结果并提高系统的性能。
在大多数情况下,你都可以从设备堆栈获取设备选择器。 例如,你可能将 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_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
当此筛选器与 Device 的 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"
当此筛选器与 Device 的 DeviceInformationKind 配对时,它将枚举所有具有 System.Devices.IpAddress 属性集的对象。 <>[] 转换为 COP_NOTEQUALS 与 NULL 值组合在一起。
System.Devices.IpAddress:<>[]
当此筛选器与 Device 的 DeviceInformationKind 配对时,它将枚举所有不具有 System.Devices.IpAddress 属性集的对象。 =[] 转换为结合了 NULL 值的 COP_EQUALS。
System.Devices.IpAddress:=[]
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将推出:在整个 2024 年,我们将逐步取消以“GitHub 问题”作为内容的反馈机制,并将其替换为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈