条形码扫描事件捕获文本

时间:2016-01-06 12:23:15

标签: c# winforms

我有一个win表单应用程序,我正在尝试添加条形码扫描。

该窗口具有用户填写的多个文本框。当用户单击一个框并扫描条形码时,它将进入所选的文本框。

即使突出显示不同的文本框,是否可以编写事件以便在扫描时将文本放入特定的文本框中?

如果是这样,我该怎么做呢。 感谢

2 个答案:

答案 0 :(得分:3)

有不同类型的条形码扫描仪:键盘楔形和串行扫描仪。

键盘楔将发送'消息',就好像它们是从键盘输入一样。所以通常只有当某种编辑框有焦点时它们才会出现。

要将扫描数据放在没有焦点的文本框中,最好和最安全的方法是在单独的后台线程中捕获消息(这可能适用于KB wedge和串行)。使用KB wedge,您的线程必须检查(前缀)代码以查看它们是否来自条形码扫描器 - 如果没有,则转发到正常的Windows消息处理。

某些条形码扫描仪可能有可用的库。

另一方面,如果应用程序只有一个窗口,并且使用了KB楔形扫描仪,则可以避免单独的线程,并且可以在该窗口内捕获消息,进行分析,如果检测到条形码,数据可以放在右边的文本框中。但在扫描条形码时,我永远不会相信用户会出现在正确的文本框中 - 实际上,该文本框最好是只读的。

但是,通常,当应用程序有多个窗口时,后台线程可能是唯一的选择。一些例子:

  • 用户扫描文档上的条形码(例如发票),并且需要自动打开该文档。该线程可以捕获代码,并打开该文档。

  • 用户扫描EAN代码,并希望查看产品的详细信息。与上述相同。

答案 1 :(得分:0)

这是一些处理扫描事件的示例代码。 scnner必须配置为串行扫描仪,它们通常带有配置扫描仪的条形码。

private SerialPort InitializeScanner()
{
    SerialPort port = null;
    bool result;
    int iPort = 2;
    do
    {
        try
        {
            result = true;
            port = new SerialPort("COM" + iPort, 9600, Parity.None, 8, StopBits.One);
            port.Close();
            if (!port.IsOpen)
                port.Open();
            port.DiscardOutBuffer();
            port.DiscardInBuffer();
            port.DataReceived += OnScan;
        }
        catch (IOException)
        {
            iPort++;
            result = false;
        }
    } while (result == false && iPort <= 20);

    return port;
}

关于这一行的全部内容:

port.DataReceived += OnScan;

这是OnScan的一个例子。您可以在该函数中设置任何文本框,但请注意您必须使用Invoke来设置GUI组件,串行端口线程与GUI的线程不同。

private void OnScan(object sender, SerialDataReceivedEventArgs args)
{
    SerialPort port = sender as SerialPort;

    string line = port.ReadExisting();

    int idx = line.IndexOf('\r');
    if (idx != -1)
    {
        line = line.Substring(0, idx);
        _scanBuffer += line;
        Invoke((MethodInvoker)delegate { OnScan(_scanBuffer); });
        _scanBuffer = "";
    }
    else
    {
        _scanBuffer += line;
    }
}