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

.net 如何判断键盘输入是否来自条形码扫描仪?,.net,keyboard,barcode-scanner,.net,Keyboard,Barcode Scanner,在一台计算机上,我有一个普通键盘和一个模拟键盘的条形码扫描仪。当我的应用程序获得键盘输入时,我如何确定该输入是来自条形码扫描仪还是真正的键盘?这取决于操作系统,但是您会发现,在大多数现代操作系统中,您将同时从两者获得输入。最好的方法是在您的平台上实际尝试 避免让两个人同时打字;) 看看微软的多点SDK (编辑:既然问题已经澄清,这个答案就不再适用了。不过,我将把它留在这里让其他人去发现)您将从这两个方面获得信息。当然,不是同时发生的。它将全部放入一个队列中,但Windows将处理来自两个键盘的关

在一台计算机上,我有一个普通键盘和一个模拟键盘的条形码扫描仪。当我的应用程序获得键盘输入时,我如何确定该输入是来自条形码扫描仪还是真正的键盘?

这取决于操作系统,但是您会发现,在大多数现代操作系统中,您将同时从两者获得输入。最好的方法是在您的平台上实际尝试


避免让两个人同时打字;)

看看微软的多点SDK


(编辑:既然问题已经澄清,这个答案就不再适用了。不过,我将把它留在这里让其他人去发现)

您将从这两个方面获得信息。当然,不是同时发生的。它将全部放入一个队列中,但Windows将处理来自两个键盘的关键事件

不过,不要束手无策。正如大卫·赫弗南(David Heffernan)所建议的那样,你可以通过将两个键盘插入电脑,打开记事本,然后键入随机字符来查看哪一个生成输入,从而轻松地解决这个问题

你回答说你想“用C代码检查”,但我不知道这意味着什么。创建一个从键盘读取输入并在屏幕上显示的控制台应用程序怎么样

using System;

class AdvancedKeyboardTester
{
   static void Main(string[] args)
   {
      for (; ;)
      {
         Console.ReadKey();
      }
   }
}
当你厌倦了这种乐趣并想退出程序时,按Ctrl+C


编辑:听起来您正在查找,它允许您为所有键盘启用原始输入,然后枚举结果以确定发送消息的设备

幸运的是,似乎有人已经为此编写了一个C#包装器库,可在Code Project上下载:


编辑2:(似乎这些信息只是不断从评论中被欺骗)


如果您使用的是条形码扫描仪,这会变得容易得多。因为它们是专门为此设计的,所以几乎都是可编程的。这意味着您可以告诉他们在输入前加上一些前哨字符(和/或后缀),这些前哨字符表示输入来自条形码扫描仪,而不是标准键盘。(查看条形码扫描仪的用户手册了解更多信息。)然后,您所要做的就是根据这些前哨字符的存在与否过滤掉键盘输入。您还可以检查前缀和后缀之间的字符输入速度。

让事件侦听器检查击键之间的时间延迟。条形码扫描器会非常快地发送击键,而人类使用键盘输入的速度相对较慢。我知道这会起作用,因为我已经在web应用程序上使用Javascript完成了这项工作

我不懂C#编程,所以我刚才给了你逻辑。快乐的一天

试试看:

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
Dim previouskeypress time As DateTime=无
私有子textbox1u KeyDown(ByVal sender作为System.Object,ByVal e作为System.Windows.Forms.KeyEventArgs)处理TextBox1.KeyDown
如果e.KeyCode=Keys,则输入
PreviousKeyPressTime=无
TextBox1.Text=String.Empty
其他的
如果PreviousKeyPressTime=无,则
PreviousKeyPressTime=日期时间。现在
如果结束
Dim startTime As DateTime=现在
Dim运行长度为Global.System.TimeSpan=startTime.Subtract(CType(Me.PreviousKeyPressTime,DateTime))
整数形式的Dim毫秒=运行长度。毫秒
Dim secs为整数=运行长度。秒
整数形式的微秒总数=((秒*1000)+毫秒)
lblDiff.Text=总毫秒

如果TotalMiliSecs几乎所有条形码阅读器都可以配置前缀和后缀。尝试使用前缀“*”和后缀“*”对您的文本框进行配置,然后在您的C#code中,每当*来自输入流时,强制将焦点放在一个不可见的文本框上,并且在该文本框的lostfocus事件中,将所有代码放在处理输入的文本框上。请注意,您选择作为前缀的字符从未在键盘中输入。另外,将文本框的tabstop属性设置为false,只是为了防止用户在浏览屏幕时接触到对象。

这里有一些模仿@asif答案的东西。它用于WPF应用程序,在C#中,并且已经过测试。我选择了秒表,因为它比datetime更精确,您可以在
System.Diagnostics
名称空间中找到它

我希望我的应用程序(不是特定的文本框)处于焦点时捕获文本,所以这也有点不同。您将看到,为了正确处理这个问题,因为我不知道实际插入的字符是什么,只有
枚举。由于主要关注数字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
}
Stopwatch\u inputStopwatch=新秒表();
字符串_input=“”;
私有无效窗口\u KeyUp(对象发送方,KeyEventArgs e)
{
如果(e.Key==Key.Enter)
{
_inputStopwatch.Reset();
把手代码(_输入);
_输入=”;
}
其他的
{
如果(!\u输入秒表。正在运行)
_inputStopwatch.Start();
否则如果(_inputStopwatch.ElapsedMilliseconds>50)
{
_inputStopwatch.Restart();
_输入=”;
}
Console.WriteLine(“调试:“+e.Key+”-“+_inputStopwatch.ElapsedMilliseconds+“ms”);
var keyString=e.Key.ToString();
if(keyString.Length==2&&keyString.StartsWith(“D”))
keyString=keyString[1]。ToString();
//如果(_inputStopwatch.ElapsedMilliseconds<50)
_输入+=键串;
//否则
//_input=“”;
_inputStopwatch.Restart();
}
}
专用无效把手条码(字符串条码输入)
{
//用条形码输入做一些事情
}

下面是一个场景,可以对OP的困境进行扩展

我有一个文本框。今日用户