裝置選擇器讓你在列舉裝置時限制搜尋的裝置數量,幫助你獲得更相關的結果並提升系統效能。
大多數情況下,你會從裝置堆疊中取得裝置選擇器。 例如,你可以用 GetDeviceSelector 來處理透過 USB 發現的裝置。 這些裝置選擇器會回傳一個進階查詢語法(AQS)字串。 欲了解更多 AQS 格式的細節,請參見 「程式化使用進階查詢語法」。
- 重要 API:Windows。Devices.Enumeration
建立濾波器串
有些情況下你需要列舉裝置,但你的情境下沒有提供的裝置選擇器。 裝置選擇器是一個包含以下資訊的 AQS 濾波器字串。 在建立篩選字串之前,你需要先了解你想列舉的裝置的一些關鍵資訊。
- 您感興趣的裝置之 DeviceInformationKind。 欲了解更多關於 DeviceInformationKind 如何影響裝置枚舉的資訊,請參見 「枚舉裝置」。
- 如何建立 AQS 濾波器字串(本主題有說明)。
- 你感興趣的房產。 可用的屬性將依據DeviceInformationKind而定。 更多資訊請參閱 裝置資訊屬性 。
- 你用來查詢的通訊協定。 這只有在你透過無線或有線網路搜尋裝置時才需要。 關於此操作的更多資訊,請參閱 「列舉網路上的裝置」。
使用Windows。Devices.Enumeration API 中,你經常會將裝置選擇器與你感興趣的裝置類型結合使用。 可用的裝置類型清單由 DeviceInformationKind 列舉定義。 這些因素的組合幫助你限制可用的裝置,只限於你感興趣的那些。 如果你沒有指定 DeviceInformationKind,或你所用的方法沒有提供 DeviceInformationKind 參數,預設的類型是 DeviceInterface。
Windows。Devices.Enumeration API 採用標準的 AQS 語法,但並非所有運算元都被支援。 關於在建構篩選字串時可用的屬性清單,請參見 裝置資訊屬性。
注意事項
使用該 {GUID} PID 格式定義的自訂屬性無法用於構建 AQS 過濾字串。 這是因為該物業類型源自知名的物業名稱。
下表列出了 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 | String |
| COP_VALUE_ENDSWITH | String |
| COP_DOSWILDCARDS | 不支援 |
| COP_WORD_EQUAL | 不支援 |
| COP_WORD_STARTSWITH | 不支援 |
| COP_APPLICATION_SPECIFIC | 不支援 |
你可以指定 NULL 來表示 COP_EQUAL 或 COP_NOTEQUAL。 這代表一個沒有價值的屬性,或該價值不存在。 在 AQS 中,你用空括號 [] 來指定 NULL 。
Important
使用 COP_VALUE_CONTAINS 和 COP_VALUE_NOTCONTAINS 運算子時,它們在字串和字串陣列上的行為不同。 對於字串,系統會執行大小寫不區分的搜尋,以確認裝置是否包含該字串作為子字串。 對於字串陣列而言,子字串不會被搜尋。 使用字串陣列時,會搜尋陣列是否包含整個指定的字串。 無法搜尋字串陣列以判斷陣列中的元素是否包含子字串。
如果你無法建立單一的 AQS 篩選字串,來適當限縮結果範圍,則可以在收到結果後再加以篩選。 不過,我們建議在將初始 AQS 篩選字串提供給 Windows.Devices.Enumeration API 時,盡可能縮小其結果範圍。 這將有助於提升應用程式的效能。
AQS 字串範例
以下範例說明如何利用 AQS 語法限制你想列舉的裝置。 所有這些濾波器串都會與 DeviceInformationKind配對,以建立完整的濾波器。 如果沒有指定類型,請記得預設類型是 DeviceInterface。
當此過濾器與
System.Devices.InterfaceClassGuid:="{2eef81be-33fa-4800-9670-1cd474972c3f}" AND
System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True
當此過濾器與 Device 的 DeviceInformationKind配對時,會列舉所有至少有一個硬體 ID 為 GenCdRom 的物件。 ~~ 翻譯為 COP_VALUE_CONTAINS。
System.Devices.HardwareIds:~~"GenCdRom"
當此過濾器與
System.Devices.ModelName:~~"Microsoft"
當此過濾器與 DeviceInterface 的 DeviceInformationKind 配對時,會枚舉所有以子字串 Microsoft 開頭名稱的物件。 ~< 翻譯為 COP_STARTSWITH。
System.ItemNameDisplay:~<"Microsoft"
當此過濾器與
System.Devices.IpAddress:<>[]
當此篩選器與 DeviceInformationKind 的 Device 搭配使用時,會列舉所有未設定 System.Devices.IpAddress 屬性的物件。 =[] 會轉換為 COP_EQUALS 與 NULL 值的組合。
System.Devices.IpAddress:=[]