何时允许调用“BarcodeScanner.GetDefaultAsync()”

本文关键字:BarcodeScanner GetDefaultAsync 调用 许调用 何时允 | 更新日期: 2023-09-27 18:27:26

我正在尝试使用新的Windows 8.1服务点API用于条形码扫描仪,如果我从以下任何位置调用GetDefaultAsync(),它将返回null

  • App.OnLaunched
  • 第一页.Loaded
  • 第一页OnNavigatedTo
  • 第一页构造函数

这似乎不是DeviceCapabilities或驱动程序的问题,因为如果我从调用它,它将完美工作

  • 按钮Click事件处理程序
  • 首页OnGotFocus
  • 第一页的构造函数(如果包装在):
    this.Dispatcher.RunIdleAsync(e => { var res = await BarcodeScanner.GetDefaultAsync(); Assert(res != null); });
  • 后续页面的构造函数

这让我怀疑你必须有焦点才能访问POS设备,并且在收到焦点之前调用了构造函数等。

问题:是否有关于何时可以呼叫GetDefaultAsync()的发布指南?

何时允许调用“BarcodeScanner.GetDefaultAsync()”

松散地遵循Microsoft Sample BarcodeScanner,尽管BarcodeScanner.GetDefaultAsync()调用有点嵌套,但我在OnNavigatedTo中连接条形码扫描仪时没有遇到任何困难。

我在OnNavigatedTo中声明了扫描仪,因为这个特定页面的目的是在由于某种原因没有找到/声明扫描仪的情况下扫描条形码。我希望提前出现错误。如果没有,我不希望页面看起来和感觉正常,我也不想强迫用户在发现条形码扫描仪不工作之前尝试扫描。

如果没有看到更多的代码,我无法告诉你为什么在不同的位置打电话在你的特定情况下不起作用,但我建议尝试以下方法。

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        EnableScanner();
    }
private async void EnableScanner()
    {
        if (await CreateDefaultScannerObject())
        {
            // after successful creation, claim the scanner for exclusive use and enable it so that data reveived events are received.
            if (await ClaimScanner())
            {
                Task<bool> AsyncSuccess = EnableClaimedScanner();
                bool x = await AsyncSuccess;
                if (x)
                {
                    HookUpEventsClaimedScanner();
                }
            }
        }
    }
        private async Task<bool> CreateDefaultScannerObject()
    {
        if (scanner == null)
        {
            UpdateOutput("Creating Barcode Scanner object.");
            scanner = await BarcodeScanner.GetDefaultAsync();
            if (scanner != null)
            {
                UpdateOutput("Default Barcode Scanner created.");
                UpdateOutput("Device Id is:" + scanner.DeviceId);
            }
            else
            {
                UpdateOutput("Barcode Scanner not found. Please connect a Barcode Scanner.");
                return false;
            }
        }
        return true;
    }
    private async Task<bool> EnableClaimedScanner()
    {
        bool result = false;
        try
        {
            await claimedScanner.EnableAsync();
            if (claimedScanner.IsEnabled)
            {
                claimedScanner.IsDecodeDataEnabled = true;
                UpdateOutput("ClaimedScanner is now Enabled.");
                result = true;
            }
            else
                UpdateOutput("ClaimedScanner wasn't Enabled.");
        }
        catch (Exception ex)
        {
            UpdateOutput( ex.Message);
        }
        return result;
    }
    public void HookUpEventsClaimedScanner()
    {
        claimedScanner.DataReceived += ScannerDataReceived;
        claimedScanner.ReleaseDeviceRequested += ScannerReleaseRequest;
    }

编辑:我意识到这个问题已经存在一年多了,但我在自己的windows 8.1嵌入式条形码扫描仪的研究中发现了这个问题,所以我想确保它不会让其他人走上错误的道路,认为GetDefaultAsync在某些呼叫情况下不起作用。