C# 条形码扫描事件捕获文本

C# 条形码扫描事件捕获文本,c#,winforms,C#,Winforms,我有一个win forms应用程序,我正在尝试添加条形码扫描 该窗口有多个可供用户填写的文本框。当用户单击一个框并扫描条形码时,它会进入所选文本框 即使高亮显示了不同的文本框,也可以在扫描时编写事件将文本放入特定的文本框中吗 如果是这样的话,我该怎么做呢。 谢谢有不同类型的条形码扫描仪:键盘楔型和串行型 键盘楔将发送“消息”,就好像它们是从键盘输入的一样。因此,通常只有当某种编辑框具有焦点时,它们才会出现 要将扫描的数据无焦点地放在文本框中,最好和最安全的方法是在单独的背景线程中捕获消息(这既适

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

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

即使高亮显示了不同的文本框,也可以在扫描时编写事件将文本放入特定的文本框中吗

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

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

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

要将扫描的数据无焦点地放在文本框中,最好和最安全的方法是在单独的背景线程中捕获消息(这既适用于KB wedge,也适用于串行线程)。使用KB wedge,线程必须检查(前缀)代码是否来自条形码扫描仪-如果不是,则转发到正常的windows消息处理

有些条形码扫描器可能有已经为您提供的库

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

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

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

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


    • 以下是一些处理扫描事件的示例代码。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;
      }
      
      下面是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;
          }
      }
      

      由于.NET的Winforms没有任何内置功能来处理条形码扫描,因此可能需要使用用于执行此操作的库来完成此操作。既然你没有告诉我们你用哪个图书馆来做这件事,这里的任何人都不可能回答这个问题。也许你可以创建一个新的库,并将名称/链接发布到你正在使用的库,这样我们就可以看到你在处理什么?你能推荐任何库使用吗?@inkey几乎所有的条形码扫描仪(至少是我使用过的那些)都以所谓的“键盘楔块”模式发送文本。它将所有键发送到突出显示的字段,就像您在键盘上键入它们一样。不,抱歉,原因有二。1.我还没有写任何条形码扫描代码,2。关于堆栈溢出,这里的建议与主题无关。我对此有点生疏,但表单有一个
      KeyPreview
      属性和一个
      PreviewKeyDown
      事件。我会先用谷歌搜索一下。
      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;
          }
      }