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

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

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

重要な API

フィルター文字列の作成

デバイスを列挙する必要があるにもかかわらず、提供されたデバイス セレクターを目的のシナリオで利用できないことがあります。 デバイス セレクターは、次の情報が含まれる AQS フィルター文字列です。 フィルター文字列を作成する前に、列挙するデバイスに関して、いくつかの重要な情報を知っておく必要があります。

  • 目的のデバイスの DeviceInformationKind。 デバイスの列挙への DeviceInformationKind の影響について詳しくは、「デバイスの列挙」をご覧ください。
  • AQS フィルター文字列を作成する方法 (このトピックで説明します)。
  • 目的のプロパティ。 使用可能なプロパティは DeviceInformationKind によって異なります。 詳しくは、「デバイス情報プロパティ」をご覧ください。
  • 照会で経由するプロトコル。 ワイヤレスまたはワイヤード ネットワーク経由でデバイスを検索する場合にのみ必要です。 そのための方法について詳しくは、「ネットワーク経由でデバイスを列挙する」をご覧ください。

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

Windows.Devices.Enumeration API では、AQS の標準的な構文が使われますが、一部の演算子はサポートされていません。 フィルター文字列の作成に使えるプロパティの一覧については、「デバイス情報プロパティ」をご覧ください。

注意事項

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

次の表は、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 文字列
COP_DOSWILDCARDS サポートされていません
COP_WORD_EQUAL サポートされていません
COP_WORD_STARTSWITH サポートされていません
COP_APPLICATION_SPECIFIC サポートされていません

COP_EQUALまたはCOP_NOTEQUALNULL を指定できます。 これは空のプロパティに変換されます。つまり、値は存在しません。 AQS では、空のかっこ [] を使用して NULL を指定できます。

重要

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

1 つの AQS フィルター文字列により結果を適切に絞り込むことができない場合は、受け取った結果をさらにフィルター処理できます。 ただし、最初の AQS フィルター文字列の結果は、 Windows.Devices.Enumeration API に提供する場合に可能な限り制限することをお勧めします。 これにより、アプリのパフォーマンスを向上させることができます。

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:=[]

参照