【问题标题】:Scanning barcodes in WPF application在 WPF 应用程序中扫描条形码
【发布时间】:2013-09-12 18:49:44
【问题描述】:

我已经搜索了一段时间,但似乎找不到答案..

我的计算机上连接了一个条形码扫描仪,它充当键盘楔。扫描器设置为向我发送 StartOfTransmission 和 EndofTransmission 字符,以便我知道处理中间的所有键并执行一些操作。

在我的应用程序的外壳中,我有以下代码...

private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    e.Handled = BarcodeScanner.Instance.ProcessTextInput(this, e.Text, e.Device, e.Timestamp);
}

如果我将注意力集中在主窗口或不处理空格(标签等)的控件上,这将非常有用

我遇到的问题是条形码(不受我控制)中有空格。如果键盘焦点在文本框或按钮中,则空格会记录在该控件中(即,如果按钮会导致单击)并且不会通过我的 Shell.xaml 中的 PreviewTextInput

我想做以下其中一项操作

  1. 如何让 Shell 预览这些字符而不是带有焦点的控件
  2. 获得 StartOfTransmission 后,将焦点移到我的 Shell,然后在 EndOfTransmission 之后,将焦点设置回控件
  3. 或者我不知道的其他方式

【问题讨论】:

  • 我已经尝试过 Keyboard.ClearFocus(),但它会停止一起读取字符。
  • 您使用条形码扫描仪有什么原因吗?在使用这种类型的硬件时,我通常会选择串行设备。然后,您可以简单地从串口读取,而不必担心您的焦点在哪里。
  • 它是一个 USB 扫描仪 (Intermec)。这是我们客户拥有的扫描仪,因此我们正在使用它进行测试。

标签: c# wpf barcode barcode-scanner


【解决方案1】:

我发现了一些有用的东西..但我不喜欢它。

在我的 Shell.Xaml 中,我添加了以下内容..

<TextBlock x:Name="lblBarcodeFocus" Focusable="True" Width="0" Height="0" />

然后在我的处理代码中,如果我检测到“StartOfTransmission”,我将焦点设置到此控件,(记住有焦点的内容),然后在完成处理后,我将焦点设置回原始控件。

必须有一种更“优雅”的方式来做到这一点......但我可以继续讨论其他问题:-)

【讨论】:

    【解决方案2】:

    这对我有用。

    常量字符串 BEGINTEXT = "["; 常量字符串ENDTEXT =“]”; StringBuilder _command;

    private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
      if(e.Text==BEGINTEXT)
      {
        _command = new StringBuilder();
      }
      else if(_command != null)
      {
        if(e.Text == ENDTEXT)
        {
          MessageBox.Show(_command.ToString());
          _command = null;
        }
        else
        {
          _command.Append(e.Text);
        }
      }
    }
    

    【讨论】:

      最近更新 更多