0

我知道条形码扫描仪就像一个键盘,并且起到这样的作用。我需要的是具有某种 api(最好是 .net/c#)的扫描仪,我可以将其插入我的应用程序。是否有开发人员已经使用或正在使用的特定扫描仪硬件供应商具有 .net api?或者我可以使用任何任意扫描仪并围绕它构建一个 api 或使用其中一个开源的吗?

所以我想做的一件事是能够在不将光标放在特定文本字段上的情况下从 USB 扫描仪中获取值。

谢谢

4

3 回答 3

4

这要看情况。如果你有一个 USB 条码扫描器,它的作用就像一个键盘,将扫描的文本直接读取到一个焦点控件中。如果您有串行条形码扫描仪,则需要使用SerialPort.NET 中的类。

如果您需要在填充文本框等之前解析数据,那么最好的办法是使用串行扫描仪。

这是一个使用的代码示例

public partial class Form1 : Form
{
     SerialPort _serialPort;

     // delegate is used to write to a UI control from a non-UI thread
     private delegate void SetTextDeleg(string text);

     private void Form1_Load(object sender, EventArgs e)
     {
           // all of the options for a serial device
           // can be sent through the constructor of the SerialPort class
           // PortName = "COM1", Baud Rate = 19200, Parity = None, 
           // Data Bits = 8, Stop Bits = One, Handshake = None
           _serialPort = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);
           _serialPort.Handshake = Handshake.None;
           _serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
           _serialPort.ReadTimeout = 500;
           _serialPort.WriteTimeout = 500;
           _serialPort.Open();
     }

     private void btnStart_Click(object sender, EventArgs e)
     {
           // Makes sure serial port is open before trying to write
           try
           {
                if(!_serialPort.IsOpen)
                     _serialPort.Open();

                _serialPort.Write("SI\r\n");
           }
           catch (Exception ex)
           {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
           }
     }

     void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
     {
          Thread.Sleep(500);
          string data = _serialPort.ReadLine();
          this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });
     }

     private void si_DataReceived(string data)
     {
           textBox1.Text = data.Trim();
     }
}
于 2010-03-03T11:19:13.143 回答
1

要留在像键盘一样的扫描仪上,您还可以尝试检测整个应用程序中按下的所有键。要KeyPress在您的应用程序中获取事件,您应该设置并注册Form.KeyPreviewtrue表单的上述事件。

现在,您将在将每个键发送到当前活动控件之前收到每个键,并且您可以随心所欲地使用它。为防止在您完成工作后它会发送到当前活动控件,请设置e.Handledtrue

但是这个解决方案肯定有两个缺点:

  1. 它仅在您的应用程序是活动窗口时才有效。因此,如果用户将焦点更改为另一个应用程序,您将不再获得按键。
  2. 也许确定传入的键是从扫描仪发送的还是用户只是按下了键盘上的一个键可能会变得非常棘手。一种可能性可能是缓存传入的键并测量它们之间的增量时间,因为人类通常不会像扫描仪那样快速输入(除非你可能是一名秘书,一分钟内敲击了 300 次或更多键盘 ;-) )。
于 2010-03-03T12:04:09.943 回答
0

我已经使用条形码扫描仪实现了一个类似的系统。我很确定(不是 100% 是很久以前的事了)文本以一个大字符串的形式出现,并且只引发了一个按键事件。因此,您可以将输入字符串与典型的条形码字符串(例如KeyPressEvent)进行匹配,如果匹配,则查找该项目。或者甚至只是检查字符串中字符的长度(好像它的键盘输入一次应该只有 1 个字符)。

您是否在基本表格上对其进行了测试?

于 2010-03-03T11:17:39.447 回答