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

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

编辑:该设备只是将数据显示为击键,并且不通过其他驱动程序进行交互。此外,我们使用各种此类设备,因此理想情况下,一种方法应该独立于所使用的楔块的具体型号而工作。但如果没有其他选择,我就只能凑合了。

有帮助吗?

解决方案

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

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

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

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

其他提示

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

我之前已经完成了哨兵字符方法,但是都是通过 KeyPress 通过连接或低级键盘挂钩 SetWindowsHookEx() 或通过 KeyPreview 在您的应用程序的主表单上。如果它满足您的要求,那么使用该方法肯定会更简单、更容易,为此我赞同已经给出的建议。

我认为您正在以可接受的方式处理它,只需注意卡发送数据的速度,我们有无线条形码扫描仪,并且它们时不时地在键盘上快速敲击键以便应用程序处理。

另外,如果您将软件分发到其他地区,那么按键可能会有所不同,例如在西班牙(我认为,但可能是法国)键盘的顶行是!“£$%^&() 与美国/英国 1234567890 相反,如果您的读卡器设置为美国/英国,那么它将发送!"£$%^&() 代替 1234567890,因为楔子只是模拟按下的键,如果 Windows 对其解释不同,那么这就是你的问题。

又投票给 jttraino的想法. 。我对销售点系统中的读卡器和支票阅读器做了同样的事情,我们需要支持键盘楔以及 USB 和 RS232。

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

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

正如 jttraino 所说,缺点是您可能必须对每个读卡器设备本身进行配置/编程。一些制造商使这变得相当容易 - 您使用谁的套件?马格泰克?韦尔奇·艾林?

我第二 @jttraino 的想法.

这是条码扫描/读码器和其他即插即用 (PnP) 此类设备的最佳选择。在我之前的任务中,我使用了相同的技术来配置几个一维和二维条形码扫描仪。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top