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

在那之后的每一次扫描,我都会得到没有结尾的行键.

我使用该代码监听mainggrid上的Keydown,并在Enter键上解析扫描的输入. 我希望是一个10个字符的字符串,行结束回车,但只得到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;
            }
        }

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

推荐答案

因为你的问题包括"知道另一种方法..."我将提供对我有效的方法:使用rate次击键来区分人工打字和更快的条形码扫描之间的区别,当然还有什么时候知道扫描完成了.

barcode scan

你可能不得不用它做实验.我只是"刚刚"try 将其移植到WPF.但基本的 idea 是我在我的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;
}

Csharp相关问答推荐

在C# 11之前, struct 中的每个字段都必须显式分配?不能繁殖

需要更改哪些内容才能修复被覆盖的财产中的无效警告CS 8765?

.NET最小API映射将T参数列表为[FromQuery]

为什么xslWriter不总是按照xslWriterSet中指定的格式格式化该文档?

如何使嵌套for-loop更高效?

如何将字节数组转换为字符串并返回?

IComponition.获取IReadOnlyCollection的返回默认属性值

如何从泛型方法返回一个可为空的T,其中T:notnull?

try 在Blazor项目中生成html

如何定义EFCore中的多个穿透

从c#列表中删除额外的对象&对象&>从ASP.NET WebForm返回json响应

在不添加不必要的尾随零的情况下本地化浮点型?

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

如何在同一成员上组合[JsonPropertyName]和[ObservableProperty]?

在.NET8中如何反序列化为私有字段?

使用未赋值的、传递的局部变量

从MudAutoComplete打开对话框,列表仍然可见

初始化具有EntityFrameworkCore和不同架构的数据库时引发System.MissingMethodExcept