如何判断键盘输入是否来自条形码扫描仪?
您将从两者中获得输入。当然不是。它将全部放入队列中,但Windows将处理来自两个键盘的键盘事件。
不过,不要无可奈何。正如David Heffernan所建议的那样,您可以通过将两个键盘插入计算机,打开记事本,然后输入随机字符以查看哪一个生成输入,轻松搞定。
您回复说您要“用C#代码检查”,但我不知道这意味着什么。如何创建一个控制台应用程序,从键盘读取输入并将其显示在屏幕上?
using System;
class AdvancedKeyboardTester
{
static void Main(string[] args)
{
for (; ;)
{
Console.ReadKey();
}
}
}
按下Ctrl键+ç时你的乐趣的轮胎,想退出程序。
编辑:这听起来像你正在寻找的RegisterRawInputDevices
function,使您可以启用所有键盘的原始输入,然后通过枚举的结果,以确定哪些设备发送的消息。
幸运的是,它看起来像有人已经写了一个C#包装库此,可用于代码项目上下载:Using Raw Input from C# to handle multiple keyboards
编辑2:(似乎的信息只是不断从欺骗中评论)
如果您使用条形码扫描仪,这会变得更容易。因为它们是为此目的而明确设计的,所以它们几乎都是可编程的。意思是说你可以告诉他们用一些指示输入来自条形码扫描器的哨兵字符(而不是标准键盘)给它们的输入加上前缀(和/或后缀)。 (请查阅您的条形码扫描仪的用户手册,以获取更多信息。)然后,您只需根据是否存在哨兵字符过滤掉键盘输入。您还可以检查前缀和后缀之间的字符输入的速度。
ok.you realy help me.but但我不能解决这个问题:你所要做的就是根据这些哨兵角色的存在与否来过滤掉键盘输入。 – 2011-04-11 12:32:34
@raha:对,基本上你可以配置扫描仪发送一些字符,基本上告诉计算机“嗨,这是我”。当您在输入流中看到这些字符时,您知道信息来自条形码扫描器,而不是来自用户在键盘上输入的内容。你检查过你的条形码扫描仪附带的手册吗?它应该有更多关于这方面的信息。 – 2011-04-11 12:37:20
谢谢亲爱的cody gray.i终于明白了!!!我会检查它(我没有它!)。 – 2011-04-11 12:40:06
这取决于操作系统,但是您会发现,在大多数现代操作系统中,您将从两者中同时获得输入。最好的方法是在你的平台上实际尝试它。
避免两种人键入的同时;)
我使用Windows XP。 – 2011-04-11 12:02:55
看看微软的多点SDK
(编辑:这个答案已经不再适用现在,这个问题已经得到澄清我是。尽管将它留在这里供其他人发现)
ok.thanks.but你能解释一下微软的MultiPoint SDK吗? – 2011-04-11 12:02:03
这是如何与**键盘**一起使用的? – 2011-04-11 12:03:10
请参阅http://en.wikipedia.org/wiki/Windows_MultiPoint_Mouse_SDK:“通过为每个工作站连接单个显示器,USB 2.0集线器,键盘和鼠标,可将多个工作站添加到WMS 2010主机中。” – 2011-04-11 13:41:00
让一个事件监听器检查按键之间的时间延迟。条形码扫描器将非常快速地发送击键,而使用键盘进行人类输入的速度相对较慢。我知道这会起作用,因为我在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
如果你解释你发布的代码,它会更好。此外,博客链接截至撰写时已死亡。 – 2012-10-28 00:41:31
这段代码记录了密钥进入速度的快慢,如果它们太慢,它确定一个人正在输入。无法分辨它是否真的有效,但这是代码的意图。 – Hucker 2014-08-13 23:04:07
几乎所有的条形码阅读器可以用一个前缀和后缀,以任何它读取配置。尝试使用例如前缀“*”和后缀进行配置,然后在您的C#代码中,每当*来自输入流并在此文本框的lostfocus事件中强制将焦点置于一个不可见的文本框中放置所有代码来处理条目。请注意,您选择的前缀字符永远不会输入到键盘中。此外,将文本框的tabstop属性设置为false,仅用于在导航屏幕时防止用户到达对象。祝你好运 !
这里是模仿@ asif的答案。它用于WPF应用程序,在C#中已经过测试。因为它比日期时间更准确,所以我使用了秒表,您会在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
}
1.打开记事本。 2.在键盘上输入以查看哪一个产生输入。 – 2011-04-11 11:45:28
谢谢,但我想检查与C#代码! – 2011-04-11 11:50:13
@raha你为什么想这样做? – 2011-04-11 11:52:18