デバイスの列挙
Windows.Devices.Enumeration API を使用すると、システムに内部接続されているデバイス、外部接続されているデバイス、またはワイヤレスプロトコルまたはネットワーク プロトコル経由で検出可能なデバイスを検索できます。
サンプル
使用可能なすべてのデバイスを列挙する最も簡単な方法は、 FindAllAsync コマンドを使用してスナップショットを作成することです (後のセクションで詳しく説明します)。
async void enumerateSnapshot(){
DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}
Windows.Devices.Enumeration API のより高度な例についてはDevice 列挙とペアリングのサンプルを参照してください。
列挙 API
Windows.Devices.Enumeration 名前空間を使用すると、システムに内部接続されているデバイス、外部接続されているデバイス、またはワイヤレス プロトコルまたはネットワーク プロトコル経由で検出可能なデバイスを検索できます。 これらの API でサポートされる機能の一部を次に示します。
- アプリケーションに接続するデバイスを見つける。
- システムに接続されているか、システムによって検出可能なデバイスに関する情報を取得します。
- デバイスの追加、接続、切断、オンライン状態の変更、またはその他のプロパティの変更時に、アプリに通知を受信してもらう。
- デバイスの接続、切断、オンライン状態の変更、またはその他のプロパティの変更時に、アプリにバックグラウンド トリガーを受け取る。
これらの API は、個々のデバイスとアプリを実行しているシステムがそのテクノロジをサポートしていれば、次のいずれかのプロトコルとバスを介してデバイスを列挙できます。 これは完全な一覧ではなく、特定のデバイスで他のプロトコルがサポートされる場合があります。
- 物理的に接続されたバス。 これには、PCI と USB が含まれます。 たとえば、デバイス マネージャーで確認できるものなどです。
- UPnP
- デジタル・リビング・ネットワーク・アライアンス (DLNA)
- 検出と起動 (DIAL)
- DNS サービス検出 (DNS-SD)
- Web Services on Devices (WSD)
- Bluetooth
- Wi-Fi Direct
- WiGig
- 店舗販売時点管理
多くの場合、列挙 API の使用について心配する必要はありません。 これは、デバイスを使用する多くの API が適切な既定のデバイスを自動的に選択するか、より合理化された列挙 API を提供するためです。 たとえば、 MediaElement は既定のオーディオ レンダラー デバイスを自動的に使用します。 アプリで既定のデバイスを使用できる限り、アプリケーションで列挙 API を使用する必要はありません。 列挙 API は、使用可能なデバイスを検出して接続するための一般的で柔軟な方法を提供します。 このトピックでは、デバイスの列挙に関する情報を提供し、デバイスを列挙する 4 つの一般的な方法について説明します。
- DevicePicker UI の使用
- システムによって現在検出可能なデバイスのスナップショットを列挙する
- 現在検出可能なデバイスを列挙し、変更を監視する
- 現在検出可能なデバイスを列挙し、バックグラウンド タスクの変更を監視する
DeviceInformation オブジェクト
列挙 API を操作するには、多くの場合、 DeviceInformation オブジェクトを使用する必要があります。 これらのオブジェクトには、デバイスに関して使用可能な情報の大部分が含まれています。 次の表では、関心のある DeviceInformation プロパティの一部について説明します。 完全な一覧については、 DeviceInformation のリファレンス ページを参照してください。
プロパティ | Comments |
---|---|
DeviceInformation.Id | これはデバイスの一意識別子であり、文字列変数として提供されます。 ほとんどの場合、これは、関心のある特定のデバイスを示すためにメソッド間で渡すだけの不透明な値です。 アプリを閉じて再度開いた後、このプロパティと DeviceInformation.Kind プロパティを使用することもできます。 これにより、同じ DeviceInformation オブジェクトを確実に回復して再利用できます。 |
DeviceInformation.Kind | これは、 DeviceInformation オブジェクトによって表されるデバイス オブジェクトの種類を示します。 これは、デバイスカテゴリまたはデバイスの種類ではありません。 1 つのデバイスは、さまざまな種類の複数の異なる DeviceInformation オブジェクトで表すことができます。 このプロパティに使用できる値は、 DeviceInformationKind と相互の関係に関するページに記載されています。 |
DeviceInformation.Properties | このプロパティ バッグには、 DeviceInformation オブジェクトに対して要求される情報が含まれています。 最も一般的なプロパティは、DeviceInformation.Nameなど、DeviceInformation オブジェクトのプロパティとして簡単に参照できます。 詳細については、「 Device 情報プロパティ」を参照してください。 |
DevicePicker ユーザー インターフェイス
DevicePicker は、ユーザーが一覧からデバイスを選択できるようにする小さな UI を作成する Windows によって提供されるコントロールです。 次のようないくつかの方法でカスタマイズできます。
- SupportedDeviceSelectors、SupportedDeviceClasses、またはその両方を DevicePicker.Filter に追加して、UI に表示されるデバイスを制御します。 ほとんどの場合、セレクターまたはクラスを追加する必要があるのは 1 つだけですが、複数のセレクターが必要な場合は、複数を追加できます。 複数のセレクターまたはクラスを追加すると、OR ロジック関数を使用して結合されます。
- デバイス用に取得するプロパティを指定します。 これを行うには、 DevicePicker.RequestedProperties にプロパティを追加します。
- Appearance を使用して、DevicePickerの外観を変更します。
- DevicePickerを表示するときのサイズと場所を指定します。
DevicePickerが表示されている間、デバイスが追加、削除、または更新されると、UI の内容が自動的に更新されます。
注: DevicePicker を使用して DeviceInformationKind を指定することはできません。 特定の DeviceInformationKindのデバイスを用意する場合は、 DeviceWatcher をビルドし、独自の UI を提供する必要があります。
キャスト メディア コンテンツと DIAL は、それぞれ独自のピッカーも提供します (使用する場合)。 これらはそれぞれ CastingDevicePicker および DialDevicePicker です。
デバイスのスナップショットを列挙する
一部のシナリオでは、 DevicePicker はニーズに適していないため、より柔軟なものが必要になります。 ユーザーに UI を表示せずに、独自の UI を構築したり、デバイスを列挙したりする必要がある場合があります。 このような状況では、デバイスのスナップショットを列挙できます。 これには、現在システムに接続されている、またはシステムとペアリングされているデバイスを調べることが含まれます。 ただし、この方法では使用可能なデバイスのスナップショットのみが検索されるため、一覧を列挙した後に接続するデバイスを見つけることができないことに注意する必要があります。 また、デバイスが更新または削除された場合も通知されません。 注意すべきもう 1 つの欠点は、このメソッドが列挙体全体が完了するまで結果を保持することです。 このため、 AssociationEndpoint、 AssociationEndpointContainer、または AssociationEndpointService オブジェクトがネットワークまたはワイヤレス プロトコルを介して検出されるため、このメソッドを使用しないでください。 完了するまでに最大 30 秒かかる場合があります。 そのシナリオでは、 DeviceWatcher オブジェクトを使用して、使用可能なデバイスを列挙する必要があります。
デバイスのスナップショットを列挙するには、 FindAllAsync メソッドを使用します。 このメソッドは、列挙プロセス全体が完了するまで待機し、すべての結果を 1 つの DeviceInformationCollection オブジェクトとして返します。 また、このメソッドは、結果をフィルター処理し、関心のあるデバイスに限定するためのいくつかのオプションを提供するためにオーバーロードされます。 これを行うには、 DeviceClass を指定するか、デバイス セレクターを渡します。 デバイス セレクターは、列挙するデバイスを指定する高度なクエリ構文 (AQS) 文字列です。 詳細については、「 デバイス セレクターの構築」を参照してください。
結果を制限するだけでなく、デバイスに対して取得するプロパティを指定することもできます。 その場合、指定したプロパティは、コレクションで返される各 DeviceInformation オブジェクトのプロパティ バッグで使用できます。 すべての種類のデバイスですべてのプロパティを使用できるわけではないことに注意してください。 デバイスの種類に使用できるプロパティを確認するには、「 Device 情報プロパティを参照してください。
デバイスの列挙と監視
デバイスを列挙するより強力で柔軟な方法は、DeviceWatcher を作成することです。 このオプションは、デバイスを列挙する際に最も柔軟性が高いオプションです。 これにより、現在存在するデバイスを列挙し、デバイス セレクターに一致するデバイスが追加、削除、またはプロパティの変更時に通知を受け取ることができます。 DeviceWatcherを作成するときは、デバイス セレクターを指定します。 デバイス セレクターの詳細については、「 デバイス セレクターの構築」を参照してください。 ウォッチャーを作成すると、指定した条件に一致するすべてのデバイスに対して次の通知が表示されます。
- 新しいデバイスが追加されたときに通知を追加します。
- 関心のあるプロパティが変更されたときに通知を更新します。
- デバイスが使用できなくなった場合、またはフィルターに一致しなくなった場合の通知を削除します。
DeviceWatcherを使用しているほとんどの場合、デバイスの一覧を保持し、デバイスに追加したり、アイテムを削除したり、ウォッチャーが監視しているデバイスから更新プログラムを受信するときにアイテムを更新したりする必要があります。 更新通知を受け取ると、更新された情報は DeviceInformationUpdate オブジェクトとして使用できるようになります。 デバイスの一覧を更新するには、まず、変更された適切な DeviceInformation を見つけます。 次に、そのオブジェクトの Update メソッドを呼び出し、 DeviceInformationUpdate オブジェクトを指定します。 これは、 DeviceInformation オブジェクトを自動的に更新する便利な関数です。
DeviceWatcherはデバイスの到着と変更時に通知を送信するため、AssociationEndpoint、AssociationEndpointContainer、または AssociationEndpointService オブジェクトはネットワークプロトコルまたはワイヤレス プロトコルを介して列挙されるため、デバイスを列挙するこのメソッドを使用する必要があります。
DeviceWatcherを作成するには、CreateWatcher のいずれかのメソッドを使用します。 これらのメソッドは、関心のあるデバイスを指定できるようにオーバーロードされています。 これを行うには、 DeviceClass を指定するか、デバイス セレクターを渡します。 デバイス セレクターは、列挙するデバイスを指定する AQS 文字列です。 詳細については、「 デバイス セレクターの構築」を参照してください。 また、デバイスに対して取得するプロパティを指定して、関心のあるプロパティを指定することもできます。 その場合、指定したプロパティは、コレクションで返される各 DeviceInformation オブジェクトのプロパティ バッグで使用できます。 すべての種類のデバイスですべてのプロパティを使用できるわけではないことに注意してください。 デバイスの種類に使用できるプロパティを確認するには、「 Device 情報プロパティ」を参照してください。
バックグラウンド タスクとしてデバイスを監視する
バックグラウンド タスクとしてのデバイスの監視は、前述のように DeviceWatcher を作成するのとよく似ています。 実際には、前のセクションで説明したように、最初に通常の DeviceWatcher オブジェクトを作成する必要があります。 作成したら、DeviceWatcher.Start の代わりに GetBackgroundTrigger を呼び出します。 GetBackgroundTrigger を呼び出すときは、目的の通知の追加、削除、更新を指定する必要があります。 追加を要求しないと、更新を要求したり削除したりすることはできません。 トリガーを登録すると、 DeviceWatcher がバックグラウンドですぐに実行を開始します。 この時点から、条件に一致するアプリケーションの新しい通知を受信するたびに、バックグラウンド タスクがトリガーされ、最後にアプリケーションがトリガーされてからの最新の変更が提供されます。
重要: アプリケーションが初めて DeviceWatcherTrigger によってトリガーされるのは、ウォッチャーが EnumerationCompleted 状態に達したときです。 つまり、最初の結果がすべて含まれます。 今後アプリケーションをトリガーする場合は、最後のトリガー以降に発生した追加、更新、および削除の通知のみが含まれます。 これは、フォアグラウンド DeviceWatcher オブジェクトとは少し異なります。最初の結果は一度に 1 つではなく、 EnumerationCompleted に達した後にのみバンドルで配信されるためです。
一部のワイヤレス プロトコルは、バックグラウンドでスキャンする場合とフォアグラウンドでスキャンしている場合、またはバックグラウンドでのスキャンをサポートしていない場合に動作が異なります。 バックグラウンド スキャンには 3 つの可能性があります。 次の表に、アプリケーションに与える可能性と影響を示します。 たとえば、Bluetoothと Wi-Fi Direct はバックグラウンド スキャンをサポートしていないため、拡張機能では、 DeviceWatcherTrigger をサポートしていません。
Behavior | 影響 |
---|---|
バックグラウンドでの同じ動作 | なし |
バックグラウンドで可能なパッシブ スキャンのみ | パッシブ スキャンが発生するのを待っている間、デバイスの検出に時間がかかる場合があります。 |
バックグラウンド スキャンはサポートされていません | DeviceWatcherTrigger によって検出可能なデバイスはなく、更新プログラムは報告されません。 |
DeviceWatcherTriggerにバックグラウンド タスクとしてのスキャンをサポートしないプロトコルが含まれている場合、トリガーは引き続き機能します。 ただし、そのプロトコルを介して更新プログラムや結果を取得することはできません。 他のプロトコルまたはデバイスの更新プログラムは、引き続き正常に検出されます。
DeviceInformationKind の使用
ほとんどのシナリオでは、DeviceInformation オブジェクトのDeviceInformationKindについて心配する必要はありません。 これは、使用しているデバイス API によって返されるデバイス セレクターでは、多くの場合、API で使用する適切な種類のデバイス オブジェクトを取得することが保証されるためです。 ただし、一部のシナリオでは、デバイスの DeviceInformation を取得する必要がありますが、デバイス セレクターを提供する対応するデバイス API はありません。 このような場合は、独自のセレクターを構築する必要があります。 たとえば、デバイス上の Web サービスには専用の API はありませんが、これらのデバイスを検出し、 Windows.Devices.Enumeration API を使用して情報を取得し、ソケット API を使用して使用できます。
デバイス オブジェクトを列挙するために独自のデバイス セレクターを構築する場合は、 DeviceInformationKind を理解しておくことが重要です。 使用可能なすべての種類と、それらが相互にどのように関連しているかについては、 DeviceInformationKindのリファレンス ページで説明します。 DeviceInformationKindの最も一般的な用途の 1 つは、デバイス セレクターと組み合わせてクエリを送信するときに検索するデバイスの種類を指定することです。 これにより、指定された DeviceInformationKindに一致するデバイスのみを列挙できます。 たとえば、 DeviceInterface オブジェクトを見つけ、クエリを実行して親 Device オブジェクトの情報を取得できます。 その親オブジェクトには追加情報が含まれている場合があります。
DeviceInformation オブジェクトのプロパティ バッグで使用できるプロパティは、デバイスのDeviceInformationKindによって異なります。 特定のプロパティは、特定の種類でのみ使用できます。 使用できるプロパティの種類の詳細については、「 Device 情報プロパティを参照してください。 そのため、上記の例では、親 Device を検索すると、 DeviceInterface デバイス オブジェクトから入手できなかった詳細情報にアクセスできます。 このため、AQS フィルター文字列を作成するときは、列挙する DeviceInformationKind オブジェクトに対して要求されたプロパティを使用できるようにすることが重要です。 フィルターの構築の詳細については、「 デバイス セレクターの構築」を参照してください。
AssociationEndpoint、AssociationEndpointContainer、または AssociationEndpointService オブジェクトを列挙するときは、ワイヤレスまたはネットワーク プロトコルを使用して列挙します。 このような場合は、 FindAllAsync を使用せず、代わりに CreateWatcher を使用することをお勧めします。 これは、ネットワーク経由で検索すると、多くの場合、 EnumerationCompletedを生成する前に 10 秒以上タイムアウトしない検索操作が発生するためです。 FindAllAsync は、 EnumerationCompleted がトリガーされるまで操作を完了しません。 DeviceWatcher を使用している場合、EnumerationCompleted が呼び出された場合に関係なく、リアルタイムに近い結果が得られます。
後で使用するためにデバイスを保存する
DeviceInformation オブジェクトは、DeviceInformation.Idと DeviceInformation.Kind の 2 つの情報の組み合わせによって一意に識別されます。 これら 2 つの情報を保持する場合は、この情報を CreateFromIdAsync に指定することで、失われた後に DeviceInformation オブジェクトを再作成できます。 これを行う場合は、アプリと統合されたデバイスのユーザー設定を保存できます。