2010-03-03 19 views
0

我知道条形码扫描器就像一个键盘一样。我需要的是具有某种api(.net/c#优选)的扫描仪,我可以插入到我的应用程序中。有没有一个特定的扫描仪硬件供应商 devs已经使用或正在使用,有一个.net API?或者我可以使用任何扫描器并在其周围构建api或使用其中一种开源软件?有没有可以用于集成到我的应用程序的.net api的条形码扫描仪(硬件)?

所以我想做的一件事就是能够将光标放在特定的文本字段上而不需要USB接口扫描仪的数值。

感谢

回答

1

要留在这就像一个键盘,你也可以尝试扫描,来检测你的整个应用程序内按下所有关键。要在您的应用程序中获得KeyPress事件,您应将Form.KeyPreview设置为true并注册到上述表单的事件。

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

但是这种解决方案具有绝对两个缺点:

  1. 它只有在你的应用程序是活动窗口的工作。因此,如果用户将焦点转移到另一个应用程序,您将不会再获得按键。
  2. 也许确定传入密钥是从扫描仪发送还是用户刚刚按下键盘上的某个键可能变得非常棘手。一种可能是缓存传入的密钥并测量它们之间的差值,导致人类通常没有像扫描仪那样快速进入(除非你可能是一分钟内有300或更多键盘命中的秘书;-) )。
+0

感谢Oli,这听起来更像我正在寻找的解决方案。我会认为扫描仪通常需要开发人员构建一个API来处理他们想要扫描仪的行为? – simplyme

0

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

您是否在基本表单上测试过它?

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

你的代码会抛出跨线程调用异常。 – Benny

+0

它不会。忘记打开DTR和RTS了。并摆脱睡眠()。 –

+0

甜美的例子凯尔,我将使用USB扫描仪,但我会回来从这里抓取一些想法这里的片段。 – simplyme

相关问题