Начало работы со сканерами штрихкодов на базе камерыGetting started with a camera barcode scanner

Приведенные здесь фрагменты кода используются только в демонстрационных целях.The snippets used here are for demonstration purposes only. Рабочий пример см. в разделе Пример сканера штрихкодов.For a working sample, see the Barcode scanner sample.

Шаг 1. Добавление объявлений возможностей в манифест приложенияStep 1: Add capability declarations to your app manifest

  1. В Microsoft Visual Studio откройте конструктор манифеста приложения, дважды щелкнув элемент package.appxmanifest в Обозревателе решений.In Microsoft Visual Studio, in Solution Explorer, open the designer for the application manifest by double-clicking the package.appxmanifest item.
  2. Выберите вкладку возможности .Select the Capabilities tab
  3. Установите флажки Веб-камера и PointOfService.Check the boxes for Webcam and PointOfService

Примечание

Возможность Веб-камера необходима, чтобы программный декодер получал кадры с камеры для декодирования, а также для обеспечения возможности предварительного просмотра из вашего приложения.The Webcam capability is required to for the software decoder to receive frames from the camera to decode as well as to provide a preview from your application

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

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

Шаг 3. Определение средства выбора устройствStep 3: Define your device selector

Вариант А. Поиск всех сканеров штрихкодовOption A: Find all barcode scanners

string selector = BarcodeScanner.GetDeviceSelector();

Вариант Б. Ограничение области действия средства выбора по типу подключенияOption B: Scoping device selector to connection type

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

Шаг 4. Перечисление всех сканеров штрихкодовStep 4: Enumerate all barcode scanners

Если вы не планируете изменять список устройств в течение срока существования приложения, вы можете перечислить моментальный снимок только один раз с помощью девицеинформатион. финдалласинк, но если вы считаете, что список сканеров штрихкодов может измениться в течение срока существования приложения, вместо него следует использовать девицеватчер .If you do not expect the list of devices to change over the lifespan of your application you can enumerate a snapshot just once with DeviceInformation.FindAllAsync, but if you believe that the list of barcode scanners could change over the lifespan of your application you should use a DeviceWatcher instead.

Важно!

Использование GetDefaultAsync для перечисления устройств PointOfService может привести к непредсказуемому поведению, так как этот просто возвращает первое найденное в классе устройство, которое может меняться от сеанса к сеансу.Using GetDefaultAsync to enumerate PointOfService devices can result in inconsistent behavior as it simply returns the first device found in the class and this can change from session to session.

Вариант А. Перечисление снимка сканеров штрихкодовOption A: Enumerate a snapshot of barcode scanners

DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

Совет

Подробнее об использовании FindAllAsync см. в статье Перечисление снимка устройств.See Enumerate a snapshot of devices for more information on using FindAllAsync.

Вариант б. перечисление доступных сканеров штрихкодов и просмотр изменений доступных сканеровOption B: Enumerate available barcode scanners and watch for changes to the available scanners

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

Шаг 5. Идентификация сканеров штрихкодов на базе камерStep 5: Identify camera barcode scanners

Сканер штрихкодов на базе камеры создается динамически, когда Windows связывает камеру или камеры, подключенные к компьютеру, с программным декодером.A camera barcode scanner is created dynamically as Windows pairs the camera(s) attached to your computer with a software decoder. Каждая пара "камера-декодер" представляет собой полнофункциональный сканер штрихкодов.Each camera - decoder pair is a fully functional barcode scanner.

Для каждого сканера штрихкодов в результирующей коллекции устройств можно различать сканеры штрихкодов камеры и физические сканеры штрихкодов, проверив свойство баркодесканнер. видеодевицеид .For each barcode scanner in the resulting device collection, you can differentiate between camera barcode scanners and physical barcode scanners by checking the BarcodeScanner.VideoDeviceID property. Значение Видеодевицеид, отличное от NULL, указывает, что объект сканера штрихкода из коллекции устройств является сканером штрихкодов камеры.A non-NULL VideoDeviceID indicates that the barcode scanner object from your device collection is a camera barcode scanner. При наличии нескольких сканеров штрихкодов камеры может потребоваться создать отдельную коллекцию, которая исключает физические сканеры штрихкодов.If you have more than one camera barcode scanner you might want to build a separate collection which excludes physical barcode scanners.

Сканеры штрихкодов камеры с помощью декодера, поставляемого с Windows, определяются следующим образом:Camera barcode scanners using the decoder that ships with Windows are identified as:

Microsoft BarcodeScanner (название вашей камеры)Microsoft BarcodeScanner (name of your camera here)

Если у вас есть несколько камер и они встроены в корпус компьютера, имя может различаться между фронтальной и задней камерами.If you have more than one camera, and they are built into the chassis of your computer, the name might differentiate between front and rear cameras.

Примечание

В будущем могут быть выпущены дополнительные программные декодеры с разными схемами именования.In the future, additional software decoders with different naming schemes might be released.

При запуске Девицеватчер (шаг 4) он перебирается по каждому подключенному устройству.When the DeviceWatcher starts (step 4), it enumerates through each connected device. Здесь мы добавим доступные Сканеры в коллекцию сканеров штрихкодов и привяжите коллекцию к ListBox.Here we add the available scanners to a barcode scanner collection and bind the collection to a ListBox.

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

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

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

При изменении SelectedIndex элемента управления ListBox (первый элемент, выбранный по умолчанию в предыдущем фрагменте), запрашивает сведения об устройстве.When the SelectedIndex of the ListBox changes (the first item is selected by default in the previous snippet), we query the device info.

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

    await SelectScannerAsync(deviceId);
}

Шаг 6. Присвоение сканера штрихкодов на базе камерыStep 6: Claim the camera barcode scanner

Используйте метод BarcodeScanner.ClaimScannerAsync для получения права на исключительное использование сканера штрихкодов на базе камеры.Use BarcodeScanner.ClaimScannerAsync to obtain exclusive use of the camera barcode scanner.

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: Предварительное изображение, предоставляемое системойStep 7: System provided preview

Предварительное изображение с камеры необходимо, чтобы пользователь мог успешно наводить камеру на штрихкоды.A camera preview is needed for the user to successfully aim the camera at barcodes. Windows предоставляет простую предварительную версию камеры, которая запускает диалоговое окно для обычного управления сканером штрихкодов камеры.Windows provides a simple camera preview that launches a dialog for basic control of the camera barcode scanner. Просто вызовите метод ClaimedBarcodeScanner.ShowVideoPreview, чтобы открыть диалоговое окно, и метод ClaimedBarcodeScanner.HideVideoPreview, чтобы закрыть его после завершения.Simply call ClaimedBarcodeScanner.ShowVideoPreview to open the dialog and ClaimedBarcodeScanner.HideVideoPreview to close it when finished.

Совет

О том, как разместить в своем приложении предварительное изображение со сканера штрихкодов на базе камеры, см. в статье Размещение предварительного изображения.See Hosting Preview to host the preview for camera barcode scanner in your application.

Шаг 8. Запуск сканированияStep 8: Initiate scan

Запускать процесс сканирования можно путем вызова метода StartSoftwareTriggerAsync.You can initiate the scan process by calling StartSoftwareTriggerAsync.

В зависимости от значения исдисабледондатарецеивед сканер может сканировать только один штрихкод, а затем останавливаться или сканировать непрерывно до вызова стопсофтваретригжерасинк.Depending on the value of IsDisabledOnDataReceived the scanner might scan only one barcode then stop or scan continuously until you call StopSoftwareTriggerAsync.

Задайте одно из значений IsDisabledOnDataReceived, чтобы задать нужное поведение сканера при декодировании штрихкода.Set the desired value of IsDisabledOnDataReceived to control the scanner behavior when a barcode is decoded.

ЗначениеValue ОписаниеDescription
ДаTrue Сканировать только один штрихкод, затем остановитьсяScan only one barcode then stop
НеверноFalse Сканировать штрихкоды без остановкиContinuously scan barcodes without stopping

См. также разделSee also

ПримерыSamples