Поделиться через


Начало работы с сканером штрихкодов камеры

В этом разделе описывается настройка базового сканера штрихкодов камеры в приложении UWP.

Замечание

Встроенный в Windows 10/11 декодировщик программного обеспечения предоставлен Digimarc Corporation .

Следующие фрагменты кода предназначены только для демонстрационных целей. Полный рабочий пример см. в примере сканера штрихкодов.

Шаг 1. Добавление объявлений возможностей в манифест приложения

  1. В Microsoft Visual Studio в обозревателе решений откройте конструктор манифеста приложения, дважды щелкнув элемент package.appxmanifest.
  2. Перейдите на вкладку "Возможности ".
  3. Установите флажки для веб-камеры и PointOfService.

Замечание

Для программного декодера требуется возможность веб-камеры, чтобы получать кадры с камеры, декодировать штрихкод и предоставлять предварительный просмотр в приложении.

Шаг 2. Добавление using директив

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

Шаг 3. Определение селектора устройства

Используйте один из методов BarcodeScanner.GetDeviceSelector для получения объекта BarcodeScanner для каждого подключенного сканера штрихкодов.

Вариант A. Поиск всех сканеров штрихкодов

string selector = BarcodeScanner.GetDeviceSelector();

Вариант B. Поиск всех сканеров штрихкодов на основе области (например, мы фильтруем по типу локального подключения)

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

Шаг 4. Перечисление сканеров штрихкодов

Если вы не ожидаете, что список устройств изменится в течение срока действия приложения, используйте DeviceInformation.FindAllAsync для получения однократного моментального снимка. Однако если список сканеров штрихкодов может измениться в течение срока существования приложения, используйте DeviceWatcher .

Это важно

Использование GetDefaultAsync для перечисления устройств PointOfService может привести к несогласованности поведения, так как оно возвращает только первое устройство, найденное в классе (которое может измениться с сеанса на сеанс).

Вариант A: Перечислить моментальный снимок всех подключенных сканеров штрихкодов на основе селектора , созданного на шаге 3.

В этом фрагменте кода мы создадим объект DeviceInformationCollection и используемDeviceInformation.FindAllAsync для заполнения.

DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

Подсказка

Дополнительные сведения об использовании DeviceInformation.FindAllAsyncсм. в Перечисление моментального снимка устройств.

Вариант Б: Перечислите доступные сканеры штрихкодов на базе селектора , созданного на шаге 3, и следите за изменениями в этой коллекции.

В этом фрагменте мы создаем наблюдатель устройства с помощью DeviceInformation.CreateWatcher .

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;
        }
    });
}

Когда в ListBox изменяется SelectedIndex (первый элемент выбран по умолчанию в предыдущем фрагменте), мы запрашиваем информацию об устройстве (задача 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 сканер может сканировать только один штрихкод и затем остановиться, или будет сканировать непрерывно до вызова StopSoftwareTriggerAsync.

Задайте требуемое значение IsDisabledOnDataReceived для управления поведением сканера при декодировании штрихкода.

Ценность Описание
Верно Сканирование только одного штрихкода, а затем остановка
Неправда Непрерывно сканировать штрихкоды без остановки

См. также