是否有条形码扫描仪(硬件)与.net api我可以用来集成到我的应用程序?

时间:2010-03-03 11:06:29

标签: c# hardware barcode-scanner

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

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

由于

3 个答案:

答案 0 :(得分:4)

嗯,这取决于。如果您有一个USB条形码扫描仪,它的作用就像一个键盘,将扫描的文本直接读入聚焦控制。如果您有串行条形码扫描器,则需要使用.NET中的SerialPort类。

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

以下是code sample的使用方法:

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();
     }
}

答案 1 :(得分:1)

要使用类似键盘的扫描仪,您也可以尝试检测整个应用程序中按下的所有按键。要在您的应用程序中获得KeyPress个事件,您应该将Form.KeyPreview设置为true并注册上述的表单事件。

现在,在发送到当前活动控件之前,您将收到所有密钥,无论您喜欢什么,都可以使用它。要防止它在您完成工作后发送到当前活动控件,请将e.Handled设置为true

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

  1. 仅当您的应用程序是活动窗口时才有效。因此,如果用户将焦点更改为另一个应用程序,您将无法再按下按键。
  2. 如果传入的密钥是从扫描仪或用户只是按下键盘上的键发送的,也许变得非常棘手。一种可能性可能是缓存传入的键并测量它们之间的增量时间,因为人通常不会像扫描仪那样快速进入(除非你可能是一分钟内有300或更多键盘命中的秘书;-) )。

答案 2 :(得分:0)

我使用条形码扫描仪实现了类似的系统。我非常确定(不是很久以前的100%)文本作为一个大字符串进入并且只引发了一个按键事件。所以你可以做的是将输入字符串与典型的条形码字符串匹配,例如KeyPressEvent,如果匹配,则查找该项目。或者甚至只检查字符串中字符的长度(就像它的键盘输入一样,它一次只能是1个字符)。

您是否已在基本表格上进行过测试?