建置裝置選取器

裝置選擇器讓你在列舉裝置時限制搜尋的裝置數量,幫助你獲得更相關的結果並提升系統效能。

大多數情況下,你會從裝置堆疊中取得裝置選擇器。 例如,你可以用 GetDeviceSelector 來處理透過 USB 發現的裝置。 這些裝置選擇器會回傳一個進階查詢語法(AQS)字串。 欲了解更多 AQS 格式的細節,請參見 「程式化使用進階查詢語法」。

建立濾波器串

有些情況下你需要列舉裝置,但你的情境下沒有提供的裝置選擇器。 裝置選擇器是一個包含以下資訊的 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。

當此過濾器與 DeviceInterface 的 DeviceInformationKind 配對時,會列舉所有包含音訊擷取介面類別且目前啟用的物件。 = 翻譯成 COP_EQUALS。

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"

當此過濾器與 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:<>[]

當此篩選器與 DeviceInformationKind 的 Device 搭配使用時,會列舉所有未設定 System.Devices.IpAddress 屬性的物件。 =[] 會轉換為 COP_EQUALS 與 NULL 值的組合。

System.Devices.IpAddress:=[]

另請參閱