C# USB 条形码扫描仪在第二次扫描时不写入行尾字符

问题描述 投票:0回答:1

我有一个带有 USB 条形码扫描仪的 WPF 应用程序。 该应用程序的目的是让客户扫描他们的客户卡并自动输入他们的详细信息。应用程序启动后第一次扫描时,该行以 ENTER 键结束,一切按预期工作。

此后的每次扫描,我都没有得到行尾键。

我使用此代码监听主网格上的 keydown 并解析 ENTER 键上扫描的输入。 我期望一个 10 个字符长的字符串,以 ENTER 结尾,但只得到 10 个字符。

跟踪仅用于调试目的。

private async void MethodWindow_KeyDown(object sender, KeyEventArgs e)
        {
            Trace.WriteLine(e.Key);
            switch (e.Key)
            {
                case Key.Enter:
                    await SwipeParser(_swipeIn);
                    _swipeIn = "";
                    break;
                default:
                    _swipeIn += GetCharFromKey(e.Key);
                    break;
            }
        }

还有其他人经历过这种情况吗?或者知道另一种检测行尾的方法吗?

c# wpf barcode-scanner
1个回答
0
投票

既然你的问题包括“知道另一种方式......”,我将提供对我有用的方法:使用击键的rate来区分人类打字和更快速的条形码扫描之间的区别,当然还有什么时候知道扫描已完成。

你可能需要尝试一下。我只是“刚刚”尝试将其移植到 WPF。但基本思想是我在我的 Winforms 应用程序中可靠使用了很多年而没有出现任何问题的东西。


WPF

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        PreviewTextInput += (sender, e) =>
        {
            foreach (char ch in e.Text)
            {
                detectScan(ch);
            }
        };
    }
    private void detectScan(char @char)
    {
        if (_keyCount == 0) _buffer.Clear();
        int charCountCapture = ++_keyCount;
        _buffer.Append(@char);
        Task
            .Delay(TimeSpan.FromSeconds(SECONDS_PER_CHARACTER_MIN_PERIOD))
            .GetAwaiter()
            .OnCompleted(() =>
            {
                if (charCountCapture.Equals(_keyCount))
                {
                    _keyCount = 0;
                    if (_buffer.Length > SCAN_MIN_LENGTH)
                    {
                        Application.Current.Dispatcher.Invoke(() => 
                        {
                            var barcode = _buffer.ToString().Trim();
                            // Optional remove from currently focused textbox.
                            if(Keyboard.FocusedElement is TextBox textBox && textBox.Text.Contains(barcode)) 
                            {
                                textBox.Text = textBox.Text.Replace(barcode, string.Empty);
                            }
                            MessageBox.Show(barcode);
                        });
                    }
                }
            });
    }
    private readonly StringBuilder _buffer = new StringBuilder();
    int _keyCount = 0;
    const int SCAN_MIN_LENGTH = 8;
    const double SECONDS_PER_CHARACTER_MIN_PERIOD = 0.1;
}
© www.soinside.com 2019 - 2024. All rights reserved.