PointofService デバイスの列挙

このトピックでは、システムで使用できるデバイスのクエリに使用されるデバイス セレクターを定義し、このセレクターを使用して、次のいずれかの方法を使用してポイント オブ サービス デバイスを列挙する方法について説明します。

方法 1: デバイス ピッカーを使用する

デバイス ピッカー UI を表示し、接続されているデバイスをユーザーが選択できるようにします。 この方法では、デバイスがアタッチおよび削除された場合に一覧の更新が処理され、他の方法よりも簡単で安全です。

方法 2: 使用可能な最初のデバイスを取得する

GetDefaultAsync を使用して、特定の POS デバイス クラスで使用可能な最初のデバイスにアクセスします。

方法 3: デバイスのスナップショット

特定の時点でシステム上に存在する POS デバイスのスナップショットを列挙します。 これは、独自の UI を構築する場合や、ユーザーに UI を表示せずにデバイスを列挙する必要がある場合に便利です。 FindAllAsync では列挙がすべて完了するまで結果が表示されません。

方法 4: 列挙と監視

DeviceWatcher は、現在存在するデバイスを列挙したり、システムでデバイスが追加または削除されたときに通知したりすることもできる、強力かつ柔軟な列挙モデルです。 これは、スナップショットが発生するのを待つのではなく、UI に表示するために現在のデバイスの一覧をバックグラウンドでメインする場合に便利です。

デバイス セレクターを定義する

デバイス セレクターを使用すると、デバイスを列挙するときに検索するデバイスを制限できます。 これにより、関連する結果のみを取得することができ、目的のデバイスを列挙するのにかかる時間を短縮できます。

検索するデバイスの種類の GetDeviceSelector メソッドを使用すると、その種類のデバイス セレクターを取得できます。 たとえば、PosPrinter.GetDeviceSelector を使用すると、USB、ネットワーク、Bluetooth POS プリンターなど、システムに接続されているすべての PosPrinters を列挙するセレクターが得られます。

using Windows.Devices.PointOfService;

string selector = POSPrinter.GetDeviceSelector();

さまざまなデバイスの種類の GetDeviceSelector メソッドは、次のとおりです。

パラメーターとして PosConnectionTypes 値を受け取る GetDeviceSelector メソッドを使用すると、セレクターによるローカル、ネットワーク、または Bluetooth 接続の POS デバイスの列挙を制限できるため、クエリの完了までにかかる時間が短縮されます。 次のサンプルでは、この方法を使用して、ローカルに接続された POS プリンターのみをサポートするセレクターを定義する方法を示しています。

using Windows.Devices.PointOfService;

string selector = POSPrinter.GetDeviceSelector(PosConnectionTypes.Local);

ヒント

より高度なセレクター文字列を構築するには、「デバイス セレクターを構築する」を参照してください。

方法 1: デバイス ピッカーを使用する

DevicePicker クラスを使用すると、ユーザーが選択できるデバイスの一覧を含むピッカー ポップアップを表示できます。 Filter プロパティを使用して、ピッカーに表示するデバイスの種類を選択できます。 このプロパティの種類は、DevicePickerFilter です。 SupportedDeviceClasses プロパティまたは SupportedDeviceSelectors プロパティを使用して、フィルターにデバイスの種類を追加できます。

デバイス ピッカーを表示する準備ができたら、PickSingleDeviceAsync メソッドを呼び出すことができます。このメソッドは、ピッカー UI を表示し、選択されたデバイスを返します。 ポップアップが表示される場所を決定する Rect を指定する必要があります。 このメソッドは、DeviceInformation オブジェクトを返します。そのため、POS API で使用するには、対象となる特定のデバイス クラスの FromIdAsync メソッドを使用する必要があります。 このメソッドの deviceId パラメーターとして DeviceInformation.Id プロパティを渡し、戻り値としてデバイス クラスのインスタンスを取得します。

次のコード スニペットでは DevicePicker を作成し、それにバー コード スキャナー フィルターを追加します。ユーザーにデバイスを選択させてから、デバイス ID に基づいて BarcodeScanner オブジェクトを作成します。

private async Task<BarcodeScanner> GetBarcodeScanner()
{
    DevicePicker devicePicker = new DevicePicker();
    devicePicker.Filter.SupportedDeviceSelectors.Add(BarcodeScanner.GetDeviceSelector());
    Rect rect = new Rect();
    DeviceInformation deviceInformation = await devicePicker.PickSingleDeviceAsync(rect);
    BarcodeScanner barcodeScanner = await BarcodeScanner.FromIdAsync(deviceInformation.Id);
    return barcodeScanner;
}

方法 2: 使用可能な最初のデバイスを取得する

POS デバイスを取得する最も簡単な方法は、GetDefaultAsync を使用して、POS デバイス クラス内で使用可能な最初のデバイスを取得することです。

次のサンプルは、BarcodeScanner に対する GetDefaultAsync の使い方を示しています。 コーディング パターンは、すべての POS デバイス クラスで同様です。

using Windows.Devices.PointOfService;

BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();

注意

GetDefaultAsync は、セッションごとに別のデバイスを返す可能性があるため、慎重に使用する必要があります。 多くのイベントがこの列挙に影響を与える可能性があります。その結果、最初に使用できるデバイスは次のようになります。

  • コンピューターに接続されているカメラの変更
  • コンピューターに接続されている POS デバイスの変更
  • ネットワークで利用できる、ネットワークに接続されている POS デバイスの変更
  • コンピューターの範囲内での Bluetooth POS デバイスの変更
  • POS 構成への変更
  • ドライバーまたは OPOS サービス対象のインストール
  • POS 拡張機能のインストール
  • Windows オペレーティング システムへの更新

方法 3: デバイスのスナップショット

シナリオによっては、独自の UI を構築したり、ユーザーに UI を表示せずにデバイスを列挙したりする必要がある場合があります。 このような状況では、DeviceInformation.FindAllAsync を使用して、現在接続されているか、システムとペアリングされているデバイスのスナップショットを列挙できます。 このメソッドは、列挙全体が完了するまで結果を保持します。

ヒント

FindAllAsync を使用して、クエリを目的の接続の種類だけに制限する場合は、GetDeviceSelector メソッドを PosConnectionTypes パラメーターと共に使用することをお勧めします。 ネットワークおよび Bluetooth 接続では、FindAllAsync の結果が返される前に列挙が完了する必要があるため、結果が遅延する可能性があります。

注意

FindAllAsync はデバイスの配列を返します。 この配列の順序はセッションごとに変わる可能性があるため、ハードコーディングされたインデックスを配列に使用して特定の順序に依存することはお勧めしません。 DeviceInformation プロパティを使用して、結果をフィルター処理するか、またはユーザーが選択できる UI を提供します。

このサンプルでは、上で定義されたセレクターを使用して FindAllAsync でデバイスのスナップショットを取得し、コレクションで返された各項目を列挙してデバイス名と ID をデバッグ出力に書き込みます。

using Windows.Devices.Enumeration;

DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

foreach (DeviceInformation devInfo in deviceCollection)
{
    Debug.WriteLine("{0} {1}", devInfo.Name, devInfo.Id);
}

ヒント

Windows.Devices.Enumeration API を使用する場合、多くの場合、DeviceInformation オブジェクトを使用して特定のデバイスに関する情報を取得する必要があります。 たとえば、DeviceInformation.ID プロパティを使用して、同じデバイスが以降のセッションで利用可能である場合に回復して再び使うことができます。また、DeviceInformation.Name プロパティをアプリでの表示目的で使用することができます。 使用できる追加のプロパティについては、DeviceInformation のリファレンス ページを参照してください。

方法 4: 列挙と監視

デバイスを列挙するより強力で柔軟な方法は、DeviceWatcher を作成することです。 デバイス ウォッチャーはデバイスを動的に列挙します。これにより、初回の列挙が完了した後にデバイスが追加、削除、または変更された場合、アプリケーションが通知を受け取ることができます。 DeviceWatcher を使用すると、ネットワーク接続されたデバイスがオンラインになったとき、Bluetooth デバイスが接続範囲内に入ったとき、さらに、ローカルに接続されたデバイスが取り外された場合に検出して、アプリケーション内で適切なアクションを実行できるようになります。

このサンプルでは、上で定義されたセレクターを使用して DeviceWatcher を作成し、AddedRemoved、および Updated 通知のイベント ハンドラーを定義します。 各通知に対して実行するアクションの詳細を入力する必要があります。

using Windows.Devices.Enumeration;

DeviceWatcher deviceWatcher = DeviceInformation.CreateWatcher(selector);
deviceWatcher.Added += DeviceWatcher_Added;
deviceWatcher.Removed += DeviceWatcher_Removed;
deviceWatcher.Updated += DeviceWatcher_Updated;

void DeviceWatcher_Added(DeviceWatcher sender, DeviceInformation args)
{
    // TODO: Add the DeviceInformation object to your collection
}

void DeviceWatcher_Removed(DeviceWatcher sender, DeviceInformationUpdate args)
{
    // TODO: Remove the item in your collection associated with DeviceInformationUpdate
}

void DeviceWatcher_Updated(DeviceWatcher sender, DeviceInformationUpdate args)
{
    // TODO: Update your collection with information from DeviceInformationUpdate
}

ヒント

DeviceWatcher の使用の詳細については、「デバイスの列挙と監視」のセクションを参照してください。

関連項目

サポートとフィードバック

質問に対する回答を見つける

ご質問があるでしょうか。 Docs Q&A フォーラムで UWP タグを使用するか、Stack Overflow で pointofservice タグを使用して質問してください。

質問を見つけやすくするために、次のようにしてください。

  • Stack Overflow で質問に pointofservice タグを追加します。
  • Q&A フォーラムの投稿に "UWP" という用語を含める