カメラ バーコード スキャナーの概要

このトピックでは、UWP アプリケーションで基本的なカメラ バーコード スキャナーを設定する方法について説明します。

Note

Windows 10/11 に付属するソフトウェア デコーダーは、Digimarc Corporation によって提供されています。

次のコード スニペットは、デモンストレーションのみを目的としています。 完全に動作するサンプルについては、バーコード スキャナーのサンプルを参照してください。

手順 1: アプリ マニフェストに機能宣言を追加する

  1. Microsoft Visual Studio のソリューション エクスプローラーで、package.appxmanifest 項目をダブルクリックしてアプリケーション マニフェストのデザイナーを開きます。
  2. [機能] タブを選択します。
  3. [Web カメラ][PointOfService] のチェック ボックスをオンにします。

Note

Web カメラ機能は、バーコードのデコードと、アプリケーションでのプレビューの提供の両方の目的で、ソフトウェア デコーダーがカメラからフレームを受信するために必要です。

手順 2: using ディレクティブを追加する

using Windows.Devices.Enumeration;
using Windows.Devices.PointOfService;

手順 3: デバイス セレクターを定義する

BarcodeScanner.GetDeviceSelector メソッドのいずれかを使用して、接続されているバーコード スキャナーごとに BarcodeScanner オブジェクトを取得します。

オプション A: すべてのバーコード スキャナーを検索する

string selector = BarcodeScanner.GetDeviceSelector();

オプション B: スコープに基づいてすべてのバーコード スキャナーを検索する (この例では、Local 接続の種類でフィルター処理します)

string selector = BarcodeScanner.GetDeviceSelector(PosConnectionTypes.Local);
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

手順 4: バーコード スキャナーを列挙する

アプリケーションの有効期間中にデバイスの一覧の変更が予期されない場合は、DeviceInformation.FindAllAsync を使用して 1 回限りのスナップショットを取得します。 ただし、アプリケーションの有効期間中にバーコード スキャナーの一覧が変更される可能性がある場合は、代わりに DeviceWatcher を使用してください。

重要

GetDefaultAsync を使用して PointOfService デバイスを列挙すると、結果の動作が一貫しない可能性があります。これは、クラスで見つかった最初のデバイス (セッションによって変化する可能性がある) を返すだけであるためです。

オプション A: 手順 3 で作成したセレクターに基づいて、接続されているすべてのバーコード スキャナーのスナップショットを列挙する

このスニペットでは、DeviceInformationCollection オブジェクトを作成し、****DeviceInformation.FindAllAsync を使用してそれにデータを設定します。

DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

ヒント

DeviceInformation.FindAllAsync の使用方法の詳細については、「デバイスのスナップショットの列挙」を参照してください。

オプション B: 手順 3 で作成したセレクターに基づいて使用可能なバーコード スキャナーを列挙し、そのコレクションに対する変更を監視する

このスニペットでは、DeviceInformation.CreateWatcher を使用して DeviceWatcher を作成します。

DeviceWatcher deviceWatcher = DeviceInformation.CreateWatcher(selector);
watcher.Added += Watcher_Added;
watcher.Removed += Watcher_Removed;
watcher.Updated += Watcher_Updated;
watcher.Start();

ヒント

詳細については、「デバイスの列挙と監視」および DeviceWatcher を参照してください。

手順 5: カメラ バーコード スキャナーを識別する

カメラ バーコード スキャナーはカメラ (コンピューターに接続) とソフトウェア デコーダーの組み合わせで構成され、Windows が動的にペアを組み合わせて、ユニバーサル Windows プラットフォーム (UWP) アプリ用の完全に機能するバーコード スキャナーを作成します。

カメラ バーコード スキャナーと物理バーコード スキャナーを区別するために BarcodeScanner.VideoDeviceID を使用できます。 VideoDeviceID が NULL 以外である場合は、デバイス コレクションのバーコード スキャナー オブジェクトがカメラ バーコード スキャナーであることを示します。 複数のカメラ バーコード スキャナーがある場合は、物理バーコード スキャナーを除外した別個のコレクションを作成できます。

Windows に付属しているデコーダーを使用するカメラ バーコード スキャナーは、次のように識別されます。

Microsoft BarcodeScanner (ここにカメラの名前)

複数のカメラがあり、それらがコンピューターのシャーシに組み込まれている場合、カメラの名前で "前面" と "背面" が区別されることがあります。

DeviceWatcher は、起動すると (「手順 4: バーコード スキャナーを列挙する」を参照)、接続されている各デバイス経由で列挙します。 次のスニペットでは、使用可能な各スキャナーを BarcodeScanner コレクションに追加し、そのコレクションを ListBox にバインドします。

ObservableCollection<BarcodeScanner> barcodeScanners = 
  new ObservableCollection<BarcodeScanner>();

private async void Watcher_Added(DeviceWatcher sender, DeviceInformation args)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        barcodeScanners.Add(new BarcodeScanner(args.Name, args.Id));

        // Select the first scanner by default.
        if (barcodeScanners.Count == 1)
        {
            ScannerListBox.SelectedIndex = 0;
        }
    });
}

ListBoxSelectedIndex が変更されると (前のスニペットでは最初の項目が既定で選択されています)、デバイス情報に対してクエリを実行します (SelectScannerAsync タスクは「手順 6: カメラ バーコード スキャナーを要求する」で実装されています)。

private async void ScannerSelection_Changed(object sender, SelectionChangedEventArgs args)
{
    var selectedScannerInfo = (BarcodeScanner)args.AddedItems[0];
    var deviceId = selectedScannerInfo.DeviceId;

    await SelectScannerAsync(deviceId);
}

手順 6: カメラ バーコード スキャナーを要求する

BarcodeScanner.ClaimScannerAsync を呼び出して、カメラ バーコード スキャナーの排他的使用を取得します。

private async Task SelectScannerAsync(string scannerDeviceId)
{
    selectedScanner = await BarcodeScanner.FromIdAsync(scannerDeviceId);

    if (selectedScanner != null)
    {
        claimedScanner = await selectedScanner.ClaimScannerAsync();
        if (claimedScanner != null)
        {
            await claimedScanner.EnableAsync();
        }
        else
        {
            rootPage.NotifyUser("Failed to claim the selected barcode scanner", NotifyType.ErrorMessage);
        }
    }
    else
    {
        rootPage.NotifyUser("Failed to create a barcode scanner object", NotifyType.ErrorMessage);
    }
}

手順 7: システム提供のプレビュー

ユーザーがバーコードにカメラを向けるのに便利なように、カメラ プレビューが必要です。 Windows には、カメラ バーコード スキャナーのコントロールに対するダイアログを起動する基本的なカメラ プレビューが用意されています。

ダイアログを開くには ClaimedBarcodeScanner.ShowVideoPreview を呼び出し、閉じるには ClaimedBarcodeScanner.HideVideoPreview を呼び出すだけです。

ヒント

アプリケーションでカメラ バーコード スキャナーのプレビューをホストするには、プレビューのホスティングに関する記事を参照してください。

手順 8: スキャンを開始する

StartSoftwareTriggerAsync を呼び出すことによって、スキャン プロセスを開始できます。

IsDisabledOnDataReceived の値に応じて、スキャナーはバーコードを 1 つだけスキャンして停止することも、StopSoftwareTriggerAsync を呼び出すまで継続的にスキャンすることもできます。

IsDisabledOnDataReceived に目的の値を設定して、バーコードがデコードされたときのスキャナーの動作を制御します。

説明
True バーコードを 1 つだけスキャンしてから停止する
False 停止せずにバーコードを継続的にスキャンする

関連項目