建置裝置選取器
裝置選取器可讓您在列舉裝置時限制要搜尋的裝置,這有助於您獲得更相關的結果並提高系統效能。
在大多數情況下,您可以從裝置堆疊中取得裝置選取器。 例如,您可以對透過 USB 發現的裝置使用 GetDeviceSelector。 這些裝置選取器會傳回進階查詢語法 (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 | String |
COP_VALUE_ENDSWITH | String |
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 硬體識別碼的所有物件。 ~~ 會轉譯為 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 屬性的所有物件。 =[] 會轉譯為 COP_EQUALS 與 NULL 值的組合。
System.Devices.IpAddress:=[]