次の方法で共有


デバイス セレクターのビルド

デバイス セレクターを使用すると、デバイスを列挙するときに検索するデバイスを制限できます。これにより、より関連性の高い結果を得て、システムのパフォーマンスを向上させることができます。

ほとんどのシナリオでは、デバイス スタックからデバイス セレクターを取得します。 たとえば、USB 経由で検出されたデバイスには、 GetDeviceSelector を使用できます。 これらのデバイス セレクターは、高度なクエリ構文 (AQS) 文字列を返します。 AQS 形式の詳細については、「 高度なクエリ構文をプログラムで使用する」を参照してください。

重要な API

フィルター文字列の構築

デバイスを列挙する必要があり、指定されたデバイス セレクターがシナリオで使用できない場合があります。 デバイス セレクターは、次の情報を含む AQS フィルター文字列です。 フィルター文字列を作成する前に、列挙するデバイスに関するいくつかの重要な情報を把握しておく必要があります。

  • 関心のあるデバイスの DeviceInformationKindDeviceInformationKindがデバイスの列挙に与える影響の詳細については、「デバイスの追加」を参照してください。
  • AQS フィルター文字列を作成する方法 (このトピックで説明します)。
  • 関心のあるプロパティ。 使用可能なプロパティは、 DeviceInformationKindによって異なります。 詳細については、「 Device 情報プロパティ を参照してください。
  • クエリを実行するプロトコル。 これは、ワイヤレスネットワークまたは有線ネットワーク経由でデバイスを検索する場合にのみ必要です。 これを行う方法の詳細については、「 ネットワーク経由でデバイスを追加する」を参照してください。

Windows.Devices.Enumeration API を使用する場合、多くの場合、デバイス セレクターを目的のデバイスの種類と組み合わせます。 使用可能なデバイスの種類の一覧は、 DeviceInformationKind 列挙体によって定義されます。 この要因の組み合わせは、関心のあるデバイスで使用できるデバイスを制限するのに役立ちます。 DeviceInformationKindを指定しない場合、または使用しているメソッドに DeviceInformationKind パラメーターが指定されていない場合、既定の種類は DeviceInterface です。

Windows.Devices.Enumeration API では正規の AQS 構文が使用されますが、すべての演算子がサポートされているわけではありません。 フィルター文字列の作成時に使用できるプロパティの一覧については、「 Device 情報プロパティを参照してください。

注意事項

{GUID} PID形式を使用して定義されたカスタム プロパティは、AQS フィルター文字列を作成するときに使用できません。 これは、プロパティ型が既知のプロパティ名から派生しているためです。

次の表に、AQS 演算子と、それらがサポートするパラメーターの種類を示します。

Operator サポートされている型
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_NOTEQUALNULLを指定できます。 これは、値のないプロパティ、または値が存在しないプロパティに変換されます。 AQS では、空のかっこ [] を使用して NULL を指定できます。

重要

COP_VALUE_CONTAINS演算子とCOP_VALUE_NOTCONTAINS演算子を使用する場合は、文字列と文字列配列で動作が異なります。 文字列の場合、システムは大文字と小文字を区別しない検索を実行して、指定された文字列が部分文字列としてデバイスに含まれているかどうかを確認します。 文字列配列の場合、部分文字列は検索されません。 文字列配列では、配列が検索され、指定した文字列全体が含まれているかどうかを確認します。 文字列配列を検索して、配列内の要素に部分文字列が含まれているかどうかを確認することはできません。

結果のスコープを適切に設定する AQS フィルター文字列を 1 つ作成できない場合は、結果を受け取った後でフィルター処理できます。 ただし、 Windows.Devices.Enumeration API に指定する場合は、最初の AQS フィルター文字列からの結果をできるだけ制限することをお勧めします。 これにより、アプリケーションのパフォーマンスが向上します。

AQS 文字列の例

次の例では、列挙するデバイスを制限するために AQS 構文を使用する方法を示します。 これらのフィルター文字列はすべて、 DeviceInformationKind とペアリングされ、完全なフィルターが作成されます。 種類が指定されていない場合は、既定の種類が DeviceInterface であることを覚えておいてください。

このフィルターは、DeviceInterfaceDeviceInformationKind とペアリングされると、オーディオ キャプチャ インターフェイス クラスを含み、現在有効になっているすべてのオブジェクトを列挙します。 =COP_EQUALS に変換されます。

System.Devices.InterfaceClassGuid:="{2eef81be-33fa-4800-9670-1cd474972c3f}" AND
System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True

このフィルターを DeviceDeviceInformationKind とペアにすると、GenCdRom のハードウェア ID が少なくとも 1 つ含まれるすべてのオブジェクトが列挙されます。 ~~COP_VALUE_CONTAINS に変換されます。

System.Devices.HardwareIds:~~"GenCdRom"

このフィルターが DeviceContainerDeviceInformationKind とペアになると、部分文字列 Microsoft を含むモデル名を持つすべてのオブジェクトが列挙されます。 ~~COP_VALUE_CONTAINS に変換されます。

System.Devices.ModelName:~~"Microsoft"

このフィルターが DeviceInterfaceDeviceInformationKind とペアになると、名前が部分文字列 Microsoft で始まるすべてのオブジェクトが列挙されます。 ~<COP_STARTSWITH に変換されます。

System.ItemNameDisplay:~<"Microsoft"

このフィルターを DeviceDeviceInformationKind とペアにすると、System.Devices.IpAddress プロパティが設定されているすべてのオブジェクトが列挙されます。 <>[] は、NULL 値と組み合わされた COP_NOTEQUALS に変換されます。

System.Devices.IpAddress:<>[]

このフィルターが DeviceDeviceInformationKind とペアになると、System.Devices.IpAddress プロパティが設定されていないすべてのオブジェクトが列挙されます。 =[] は、NULL 値と組み合わされた COP_EQUALS に変換されます。

System.Devices.IpAddress:=[]

参照