处理键盘“wedge”输入的最佳方法

时间:2008-09-03 19:55:06

标签: c# point-of-sale

我正在编写一个C#POS(销售点)系统,它从键盘楔形磁卡读卡器输入。这意味着输入从磁条读取的任何数据都会被输入,就像它在键盘上非常快速地输入一样。目前我通过附加到KeyPress事件并寻找一系列包含刷卡哨兵角色的非常快速的按键来处理这个问题。

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

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

5 个答案:

答案 0 :(得分:10)

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

条形码阅读器设备使用相同的技术,因此您的应用程序知道可以获得焦点或处理来自设备的数据输入。

这种方法的不利之处在于您必须正确配置外部设备。这可能是部署问题。

这假设您的设备只是将数据显示为击键,而不是通过其他驱动程序进行接口。

答案 1 :(得分:3)

如果您提前知道设备的硬件ID,也可以使用Raw Input API。 I blogged about this recently.这可能是疯了,但它满足了我的要求:我的主要目标是即使应用程序失去焦点也能够接收输入,因为有人在翻找托盘上的物品时偶然撞到某物。次要目标是我无法添加任何哨兵角色,因为这会破坏与扫描枪一起使用的现有第三方应用程序。

之前我已经完成了哨兵角色方法,无论是通过KeyPress附加还是通过SetWindowsHookEx()或通过应用程序主窗体上的KeyPreview进行的低级键盘挂钩。如果它符合您的要求,那么使用该方法肯定会更加简单和容易,为此,我已经给出了已经提出的建议。

答案 2 :(得分:2)

我认为你是以可接受的方式处理它,只要小心卡片发送数据的速度,我们有无线条形码扫描器,现在又一次他们在键盘上按键敲击以快速应用处理。

如果你要将你的软件发布到其他地区,那么关键的行为可能会有所不同,例如在西班牙(我想,但可能是法国),键盘的顶线是!“££%^&amp; < em>()反对美国/英国1234567890,如果您的读卡器设置为usa / uk,那么它将发送!“££%^&amp; ()代替1234567890,因为楔子只是模仿该键被按下,如果windows解释它与你的问题不同。

答案 3 :(得分:1)

jttraino's idea的另一次投票。我在销售点系统中的读卡器和支票阅读器也做了同样的事情,我们需要支持键盘楔以及USB和RS232。

基本上,选择一个不太可能来自键盘的短字符序列,并编写消息处理循环以查看这些字符到达。如果您获得了与您的模式匹配的完整字符流,则可以解码其余输入,直到您按下指定的“结束”序列,或直到您确定传入的序列出错。选择一个难以或不可能的字符串,从常规键盘进入应用程序,如编辑掩码和各种屏幕的行为。

一个很好的起点就像tilda-pling(〜!),因为这些角色不太可能出现在任何人的个人细节中,并且不太可能需要一起出现在笔记等文本中:-)

正如jttraino所说,缺点是您可能必须配置/编程每个阅读器设备本身。有些制造商这样做很容易 - 你使用哪个套件?的MagTek? Welch Allyn?

答案 4 :(得分:0)

我是第二个@jttraino's idea

这是条形扫描/代码阅读器和其他即插即用(PnP)设备的使用方法。我在之前的任务中使用了相同的技术来配置几个1D和2D条形码扫描仪。