处理来自键盘"楔"的输入的最佳方法

时间:2020-03-05 18:47:15  来源:igfitidea点击:

我正在编写一个CPOS(销售点)系统,该系统从键盘楔形磁卡阅读器获取输入。这意味着将输入从磁条读取的所有数据,就像在键盘上快速键入一样。目前,我通过添加到KeyPress事件并查找包含卡刷卡前哨字符的一系列非常快速的按键来处理此问题。

有没有更好的方法来处理这种输入?

编辑:设备只是将数据显示为按键,并且无法通过其他驱动程序进行交互。另外,我们使用了多种类型的设备,因此理想情况下,一种方法应独立于所使用的楔形的特定模型而工作。但是,如果没有其他选择,我将不得不做。

解决方案

回答

我们可以做的一件事是,我们应该能够配置楔形阅读器,以便它在字符串之前或者之后显示一个或者多个转义符。我们将使用这些转义字符来知道我们即将拥有(或者刚刚拥有)磁卡输入。

条形码读取器设备使用相同的技术,因此应用程序知道要获得焦点或者处理从设备输入的数据。

这种方法的缺点是我们必须正确配置外部设备。这可能是部署问题。

假设设备只是将数据显示为击键,而不通过其他驱动程序进行交互。

回答

我第二个@jttraino的想法。

这是条码扫描/条码读取器和其他即插即用(PnP)设备的必经之路。我在以前的作业中使用了相同的技术来配置一对一维和二维条形码扫描仪。

回答

我认为我们正在以一种可接受的方式来处理它,只是要小心卡发送数据的速度,我们拥有无线条形码扫描仪,并且他们不时地在键盘上敲击按键,以使应用程序能够快速处理它们。

另外,如果我们将软件分发到其他地区,则按键可能会有所不同,例如在西班牙(我认为,但可能是法国),键盘的最上面一行是!" $%^&()而不是美国。 / UK 1234567890,并且如果读卡器设置为usa / uk,则它将发送!" $%^&()代替1234567890,因为楔形只是模拟该键被按下,并且如果Windows解释该键不同,则它就是问题。

回答

对jttraino的想法进行了另一次投票。对于销售点系统中的读卡器和支票读取器,我需要做的事情都差不多,我们需要支持键盘楔子以及USB和RS232.

基本上,选择一小段不太可能来自键盘的字符,然后对消息处理循环进行编程以查看这些字符的到来。如果我们获得了与模式匹配的完整字符流,则可以解码其余输入,直到达到指定的"结束"序列,或者直到确定输入序列有误为止。考虑到编辑遮罩和各种屏幕的行为,请选择很难或者不可能从常规键盘输入到应用程序中的字符串。

一个很好的起点是像tilda-pling(〜!)之类的东西,因为这些字符不太可能出现在任何人的个人详细信息中,也不太可能需要一起出现在注释的文本等中:-)

就像jttraino所说的那样,不利的一面是我们可能必须对每个读取器设备本身进行配置/编程。一些制造商使此操作相当容易,我们使用的是谁的套件?麦泰克?韦尔奇·阿林(Welch Allyn)?

回答

如果我们提前知道设备的硬件ID,也可以使用Raw Input API。我最近在博客上写过。它可能很疯狂,但满足了我的要求:在我的案例中,主要目的是即使应用程序失去焦点时也能够接收输入,因为有人在翻来覆去扫描托盘上的物品时不小心撞到了东西。第二个目标是我不能添加任何前哨字符,因为那样会破坏与扫描枪一起使用的现有第三方应用程序。

我之前已经完成了哨兵字符方法,无论是通过KeyPress附件还是通过SetWindowsHookEx()或者应用程序主窗体上的KeyPreview的低级键盘钩子完成的。如果它满足要求,那么使用该方法肯定会更加简单,为此,我将已经给出的建议排在第二位。