我正在编写一个从键盘楔形磁卡阅读器获取输入的 C# POS(销售点)系统。这意味着它从磁条读取的任何数据都会被输入,就像在键盘上快速键入一样。目前,我正在通过附加到 KeyPress 事件并寻找一系列包含刷卡标记字符的非常快速的按键来处理此问题。
有没有更好的方法来处理这种输入?
编辑:该设备只是将数据显示为击键,并且不通过其他驱动程序进行接口。此外,我们使用各种这些类型的设备,因此理想情况下,一种方法应该独立于所使用的特定型号的楔子来工作。但是,如果没有其他选择,我将不得不凑合。
我正在编写一个从键盘楔形磁卡阅读器获取输入的 C# POS(销售点)系统。这意味着它从磁条读取的任何数据都会被输入,就像在键盘上快速键入一样。目前,我正在通过附加到 KeyPress 事件并寻找一系列包含刷卡标记字符的非常快速的按键来处理此问题。
有没有更好的方法来处理这种输入?
编辑:该设备只是将数据显示为击键,并且不通过其他驱动程序进行接口。此外,我们使用各种这些类型的设备,因此理想情况下,一种方法应该独立于所使用的特定型号的楔子来工作。但是,如果没有其他选择,我将不得不凑合。
您可以做的一件事是您应该能够配置您的楔形阅读器,以便它在字符串之前或之后显示一个或多个转义字符。您将使用这些转义字符来知道您即将拥有(或刚刚拥有)magcard 输入。
条形码阅读器设备使用了相同的技术,因此您的应用程序知道获取焦点或处理来自设备的数据输入。
这种方法的不利之处在于您必须正确配置外部设备。这可能是一个部署问题。
这假设您的设备只是将数据显示为击键,并且不通过其他驱动程序进行接口。
如果您提前知道设备的硬件 ID,也可以使用原始输入 API。我最近在博客上写过这个。这可能很疯狂,但它满足了我的要求:在我的案例中,主要目标是即使在应用程序失去焦点时也能够接收输入,因为有人在四处翻找扫描托盘上的物品时不小心撞到了东西。第二个目标是我不能添加任何标记字符,因为这会破坏与扫描枪一起使用的现有第三方应用程序。
但是,我之前已经完成了哨兵字符方法,无论是通过附加还是通过应用程序主窗体上KeyPress
的低级键盘挂钩SetWindowsHookEx()
或通过。KeyPreview
如果它满足您的要求,那么使用该方法肯定会更简单、更容易,为此我赞同已经给出的建议。
我认为您正在以可接受的方式处理它,请注意卡发送数据的速度,我们有无线条码扫描仪,并且他们不时将击键扔到键盘上以快速处理应用程序。
此外,如果您将软件分发到其他地区,那么按键可能会有所不同,例如在西班牙(我认为,但可能是法国)键盘的顶行是 !"£$%^& () 反对美国/英国 1234567890,如果您的读卡器设置为美国/英国,那么它将发送 !"£$%^& () 代替 1234567890,因为楔形只是模拟按下的键,如果 Windows 解释它不同,那么这是你的问题。
再次为jttraino 的想法投票。在我们需要支持键盘楔以及 USB 和 RS232 的销售点系统中,我对读卡器和支票阅读器的做法也差不多。
基本上,选择一个不太可能来自键盘的短序列字符,并编写您的消息处理循环以查看这些字符的到达。如果您获得了与您的模式匹配的完整字符流,您可以解码输入的其余部分,直到您达到指定的“结束”序列,或者直到您确定传入的序列有误。考虑到编辑掩码和各种屏幕的行为等信息,选择一个很难或不可能从常规键盘输入到您的应用程序的字符串。
一个很好的起点是类似 tilda-pling (~!),因为这些字符不太可能出现在任何人的个人详细信息中,也不太可能需要一起出现在便条的文本中,等等。:-)
正如 jttraino 所说,缺点是您可能必须自己配置/编程每个阅读器设备。一些制造商使这变得相当容易 - 您使用的是谁的套件?玛格泰克?韦尔奇·阿林?
这是条形扫描/代码阅读器和其他即插即用 (PnP) 设备的最佳选择。在我之前的作业中,我使用了相同的技术来配置几个 1D 和 2D 条码扫描仪。