介绍
绝大多数的条形码扫描仪模拟键盘,这使得他们可以很容易地在任何应用程序中使用。用户只需把任何文本输入焦点控制和扫描条形码。
此相同的行为,但也允许用户扫描到的条形码扫描不打算领域,并不允许应用程序采取即时行动收到扫描时,因为应用程序有没有区别于键盘上的条形码扫描仪输入的方式。
许多厂商都有自己的API,它可以用来区分键盘上的条形码扫描仪,但在现实世界中,有成千上万的条码扫描器和依靠供应商特有的API是不实际的。
幸运的是,有一个简单的方法还没有众所周知,从条形码扫描仪检测不同的输入。这允许用户无需扫描条码重点放在一个特殊的领域,或激活按钮或菜单项每次扫描前。背景
我的项目之一,需要与销售的POS外围设备集成,接收,库存和其他标准的零售功能。最近,我们需要整合条码阅读器。此前我们曾用于查找,序列号输入等,但用户需要先告诉软件,通过点击一个按钮,或先选择一个文本框然后扫描代码。该软件不知道扫描仪和键盘之间的区别,只是发送给它的文本。
这种方法可以让很多用户错误的,也是低效的。有办法直接集成条形码扫描仪,使用第三方库的SDK,或OPOS的。这似乎是一个麻烦很多,只是为了能够从条形码扫描仪获得的数据。
很多人建议OPOS和我们已经使用的OPOS与高速热敏打印机的交互。然而,OPOS的依靠个别安装在每台机器上,并为每一块硬件单独的OPOS驱动程序。供应商的OPOS支持是多种多样的,常常以次充好。对于打印机,我们接受这是因为它提供比与原始的打印机接口和热敏打印机交互的重大利益,往往是更高的终端设备,建立良好的OPOS驱动程序。条形码扫描仪,但成本较低的项目,我们可能有很多不同的品牌。
我做更多的搜索,发现很多用户采取使用WINAPI和键盘钩子。这些解决方案大多需要很多外部呼叫和许多依赖Windows消息没有工作,以及与WPF。他们还需要唯一标识每台机器上,他们的设备,专门的开发。我的第一次尝试
条形码扫描仪可以编程发送扫描每一个前缀和后缀,通常STX(文本开始)和ETX(文本的末尾)。他们是0x02和0x03的ASCII中,分别。
我在一个WPF应用程序创建了一个KeyDown事件和扫描条形码。我收到的第一个关键是LeftCtrl。 LeftCtrl??明显的WPF不知道如何处理低ASCII码该键盘设计从未发送。 WPF处理扫描码无论如何,并非所有的ASCII码,可以映射到扫描码。
我放弃了这一做法,并尝试过许多相当复杂的WINAPI方法尝试访问原始输入条码扫描器。大多数问题与WPF和需要一个适应的很多,因为他们的书面WinForms和依靠Windows消息。我工作相对容易变得激动。但后来我跑了我的第一次测试,并得到了162码。 162是扫描LeftCtrl的代码。 :(重试
回到WPF的和简单PreviewKeyUp的。我决定挖过去的第一个字符的深一点,并意识到,有一个位模式。我希望,我可以可靠地检测这种模式和拦截击键。我做了一个程序来记录关键的跌宕起伏,并很快意识到,世腾(0X02)被翻译成:LeftCtrl向下乙下B上涨LeftCtrl最多
,然后打我。我以前的假设是错误的。窗户看到0X02。以前,我曾假设Windows是感到困惑,但实际上却在做什么位的翻译。在很老的ASCII天,按Ctrl的信被映射到1-26在ASCII。这是按Ctrl-A,相当于为0x01。在许多预PC机,可以按Ctrl-M和电脑会看到它作为输入(字符0x0D)。因此,Windows看到的0X02条码扫描器,将其转换成一个系列代表CTRL-B键码扫描。
现在我的东西,我可以使用。"守则"
我添加了两个事件,我的主窗口:PreviewKeyUp和PreviewKeyDown。我一直在Ctrl键的状态的轨道,然后找一个B CTRL-B检测。从那里,我收集了所有的输入,直到我发现用CTRL-C(ETX,0x03的)序列。请注意,大多数条形码阅读器不发送默认情况下,这些序列,但几乎所有可以很容易地重新配置,这样做的。
CTRL-B按Ctrl-C,我以为所有的输入是从条形码扫描仪,并设置事件处理财产,所以在我的程序的其他事件将不会看到数据。在最后,我呼吁的事件和数据交给了我的计划。演示
在演示中,编辑栏的唯一目的是显示正常的键盘输入,但没有条形码扫描仪输入。左侧列表框显示了原始的键扫描序列,每个条码的结果添加到右边的列表框中。
演示是建立在C#中,WPF中,和Visual Studio 2010。它可以很容易地使用VB.NET的WinForms,和其他版本的Visual Studio。
{S0的}重用
这种方法可以很容易地封装到一个类任何窗口容易重用。在我的应用程序,所有我们的WPF窗口的下降从一个共同的基类,所以我已经把那里的功能。对于每个窗口,我只需要添加在构造:
导致ScanReceived = Scan;
void Scan(string aData) {
MessageBox.Show("Scan received: " + aData);
}
没有使用WINAPI,侵入性的代码,或复杂的代码,我发现了一个可靠的解释条码扫描仪输入的方法。事实上,实际的代码可以很容易地在屏幕上。用这种方法,你也并不需要识别码设备条码扫描器。简单的代码看起来按键模式和数据分离出来。警告
有一个小的警告。 CTRL-B不能用于在应用程序菜单或其他热键功能。此代码来检测从条形码扫描仪输入的开始。代码看起来也按Ctrl-C,但只有经过CTRL-B。在其他时间,它忽略CTRL-C,所以常用快捷拷贝到剪贴板不使用此代码的冲突。已知问题
有很多其他按键处理程序时,窗口上存在的一些问题。在我的生产代码,我已经解决了这些,只要时间允许,将更新演示。未来的扩展
条形码扫描仪也可以编程发出其他前缀识别代码的扫描类型,即UPC与CODE39。我们处理的产品,这是非常有用的因为如果一个UPC扫描我们知道它标识的产品,CODE39和其他非UPC / EAN条码,而通常代表项目的序号。这允许用户很快以收到的产品,而不需要先找出他们想要做的软件,而该软件可以推断出用户的行动基础在活动窗口。我扩大了我的代码,认识到其他的前缀和其他可用的事件响应。