You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 使用Zebra DS3608扫描枪实现条码录入textbox的问题咨询

问题根源

该问题是代码逻辑问题,和扫描枪配置无关,两个核心错误导致异常:

  1. 你在构造函数中将BarcodeScanner声明为局部变量,构造函数执行完成后该实例会被垃圾回收,扫描事件绑定直接失效。
  2. 窗体初始化阶段调用textBox1.Focus()无效,此时窗体还未完成渲染,焦点会被后续加载的ComboBox控件抢走,而Zebra DS3608默认是模拟键盘输入,内容自然会输入到当前持有焦点的ComboBox中。

修复步骤

1. 将扫描器实例改为类全局成员

在PrintLabel类中声明全局的扫描器变量,避免实例被回收:

public partial class PrintLabel : Form
{
    MySqlConnection connection;
    MySqlCommand command;
    MySqlDataReader dr;
    // 新增全局扫描器实例
    private BarcodeScanner _barcodeScanner;

2. 调整构造函数逻辑,删除无效焦点设置

public PrintLabel()
{
    InitializeComponent();
    // 移除这里的Focus,此时窗体未渲染,设置无效
    _barcodeScanner = new BarcodeScanner(textBox1, true); // 第二个参数传true,拦截扫描输入不发送到焦点控件
    _barcodeScanner.BarcodeScanned += BarcodeScanner_BarcodeScanned;
    Fillcombox();
}

这里构造函数的第二个参数suppressKeyPress = true是USB_Barcode_Scanner库内置参数,开启后会拦截扫描枪的键盘输入事件,不会把内容输入到当前焦点控件,只会通过事件返回扫描结果。

3. 新增窗体Shown事件设置焦点

在窗体设计器中给PrintLabel绑定Shown事件,在窗体完全渲染完成后再设置文本框焦点:

private void PrintLabel_Shown(object sender, EventArgs e)
{
    textBox1.Focus();
}

验证方法

可以先在扫描回调事件中加弹窗测试,确认事件是否正常触发:

private void BarcodeScanner_BarcodeScanned(object sender, BarcodeScannerEventArgs e)
{
    // 测试用,扫描时会弹出结果说明事件绑定正常
    // MessageBox.Show(e.Barcode);
    textBox1.Text = e.Barcode;
}

如果弹窗正常弹出,说明修复完成,删除测试弹窗即可。


内容的提问来源于stack exchange,提问作者Prochu1991

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:57:00