如何判断键盘输入是否来自条形码扫描仪?

在一台计算机上,我有一个常规键盘和一个模拟键盘的条形码扫描仪。当我的应用程序获得键盘输入时,如何确定该输入是来自条形码扫描仪还是真正的键盘?     
已邀请:
你会得到两者的意见。当然不是同时发生的。它将全部放入队列中,但Windows将处理来自两个键盘的键事件。 不过,不要无助。正如David Heffernan建议的那样,你可以通过将两个键盘插入计算机,打开记事本,然后输入随机字符来查看哪一个产生输入,从而轻松解决这个问题。 您回复说要“用C#代码检查”,但我不知道这意味着什么。如何创建一个从键盘读取输入并在屏幕上显示的控制台应用程序?
using System;

class AdvancedKeyboardTester
{
   static void Main(string[] args)
   {
      for (; ;)
      {
         Console.ReadKey();
      }
   }
}
当你厌倦了乐趣并想要退出程序时按Ctrl + C. 编辑:听起来你正在寻找
RegisterRawInputDevices
功能,它允许你为所有键盘启用原始输入,然后枚举结果以确定哪个设备发送了消息。 幸运的是,看起来有人已经为此编写了一个C#包装器库,可以在Code Project上下载:使用C#的Raw Input来处理多个键盘 编辑2 :(似乎信息只是从评论中汲取) 如果您使用条形码扫描仪,这将变得更加容易。因为它们是为此目的明确设计的,所以它们几乎都是可编程的。这意味着您可以告诉他们为输入添加前缀(和/或后缀)以及指示输入来自条形码扫描器而非标准键盘的一些标记字符。 (有关详细信息,请查看条形码扫描仪的用户手册。)然后,您所要做的就是根据这些标记字符的存在与否来过滤掉键盘输入。您还可以检查输入前缀和后缀之间字符的速度。     
看看微软的MultiPoint SDK (编辑:现在问题已经澄清,这个答案不再适用了。我将其留在这里供其他人发现)     
这取决于操作系统,但是您会发现在大多数现代操作系统中,您将同时获得两者的输入。最好的方法是在您的平台上实际尝试它。 避免让两个人同时输入;)     
让事件监听器检查击键之间的时间延迟。条形码扫描仪将非常快速地发送击键,而使用键盘的人类输入将相对较慢。我知道这会有效,因为我在Web应用程序上使用Javascript做了这样的事情。 我不知道C#编程,所以我刚给你了逻辑。愉快的一天!     
几乎所有条形码阅读器都可以配置前缀和后缀,无论它读取什么。例如,尝试使用前缀“*”和后缀来配置你的,然后在你的C#代码中,只要*来自输入流,并且在此文本框的lostfocus事件中,就将焦点强制转换为不可见的文本框把所有代码都放到处理条目中。请注意,您选择作为前缀的字符永远不会输入键盘。此外,将文本框的tabstop属性设置为false,只是为了防止用户在导航屏幕时到达对象。祝好运 !     
这是以@asif的答案为模型的。它用于WPF应用程序,在C#中并且已经过测试。我使用秒表,因为它比datetime更准确,你会在
System.Diagnostics
命名空间中找到它。 当应用程序(不是特定的文本框)成为焦点时,我希望我能捕获文本,所以这也有点不同。你会看到为了正确处理它,因为我不知道插入实际字符是什么,只有
Key
枚举。由于主要关注数字1-10,而那些枚举是
D1
D2
等,我需要时剥掉D部分。
Stopwatch _inputStopwatch = new Stopwatch();
string _input = "";

private void Window_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        _inputStopwatch.Reset();
        HandleBarcode(_input);
        _input = "";
    }
    else
    {
        if (!_inputStopwatch.IsRunning)
            _inputStopwatch.Start();
        else if (_inputStopwatch.ElapsedMilliseconds > 50)
        {
            _inputStopwatch.Restart();
            _input = "";
        }

        Console.WriteLine("DEBUG: " + e.Key + " - " + _inputStopwatch.ElapsedMilliseconds + "ms");

        var keyString = e.Key.ToString();
        if (keyString.Length == 2 && keyString.StartsWith("D"))
            keyString = keyString[1].ToString();

        //if (_inputStopwatch.ElapsedMilliseconds < 50)
            _input += keyString;
        //else
        //    _input = "";

        _inputStopwatch.Restart();
    }
}

private void HandleBarcode(string barcodeInput)
{
    //do stuff with the barcode input
}
    
尝试:
Dim PreviousKeyPressTime As DateTime = Nothing

Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown

    If e.KeyCode = Keys.Enter Then
        PreviousKeyPressTime = Nothing
        TextBox1.Text = String.Empty
    Else
        If PreviousKeyPressTime = Nothing Then
            PreviousKeyPressTime = DateTime.Now
        End If
        Dim startTime As DateTime = Now
        Dim runLength As Global.System.TimeSpan = startTime.Subtract(CType(Me.PreviousKeyPressTime, DateTime))
        Dim millisecs As Integer = runLength.Milliseconds
        Dim secs As Integer = runLength.Seconds
        Dim TotalMiliSecs As Integer = ((secs * 1000) + millisecs)

        lblDiff.Text = TotalMiliSecs

        If TotalMiliSecs <= 50 Then
            lblMsg.Text = String.Empty
        Else
            lblMsg.Text = "keyboard Input not Allow"
        End If
        PreviousKeyPressTime = DateTime.Now
    End If
End Sub
资料来源:http://itlearnerinsect.blogspot.com/     

要回复问题请先登录注册