返回首页

介绍
绝大多数的条形码扫描仪模拟键盘,这使得他们可以很容易地在任何应用程序中使用。用户只需把任何文本输入焦点控制和扫描条形码。
此相同的行为,但也允许用户扫描到的条形码扫描不打算领域,并不允许应用程序采取即时行动收到扫描时,因为应用程序有没有区别于键盘上的条形码扫描仪输入的方式。
许多厂商都有自己的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,但只有经过C​​TRL-B。在其他时间,它忽略CTRL-C,所以常用快捷拷贝到剪贴板不使用此代码的冲突。已知问题
有很多其他按键处理程序时,窗口上存在的一些问题。在我的生产代码,我已经解决了这些,只要时间允许,将更新演示。未来的扩展
条形码扫描仪也可以编程发出其他前缀识别代码的扫描类型,即UPC与CODE39。我们处理的产品,这是非常有用的因为如果一个UPC扫描我们知道它标识的产品,CODE39和其他非UPC / EAN条码,而通常代表项目的序号。这允许用户很快以收到的产品,而不需要先找出他们想要做的软件,而该软件可以推断出用户的行动基础在活动窗口。我扩大了我的代码,认识到其他的前缀和其他可用的事件响应。

回答

评论会员:AbinashBishoyi 时间:2012/02/07
!伟大的工作,
评论会员:ptaku20 时间:2012/02/07
您好,
我想它会很酷,如果你可以添加一些扫描仪配置选项。由于不同的条形码扫描仪有不同的配置(等序言,结尾,描述条码长度,描述条码类型的字符数的字符数)可以冷静添加这种配置,尤其是如果你需要做一些具体工作的基础上,条码类型。我有这样的配置问题,在我们公司的应用,所以我知道我在谈论
评论会员:游客 时间:2012/02/07
|ptaku20:有很多东西标识喜欢做,已经扩大了我们的内部代码。大多数扫描仪可以编程使用STX/ETX尺寸,其实在我们的一些扫描仪这些都是他们会支持的唯一代码。我已经张贴在这里虽然是足以让每个人都区分从键盘扫描器的主要障碍,尤其是在开始。通常我设置了一个在CodePlex开源项目,但它是如此之少的代码,我不能看到它值得努力。乍得Z。豪尔,又名葛根"编程是一种艺术形式的还击"我的技术资料:{A}我的博客:{A2}:萨沙・巴伯
答案乍得的谢谢。
我不想得罪你,我只是想提,感知,扫描仪始终涉及LeftCtrl,按Ctrl乙,CTRL C代码是错的,因为他们是真的在多次不同的(有时甚至是大部分的时间)。我理解你写的具体方案,但我预计从这篇文章时,我读的标题
"使用条码扫描器。NET"
评论会员:萨沙理发 时间:2012/02/07
我唯一的工作与十几个类型的台左右,但我所有的可能。我们有一些模式,是10岁,可以设定任何从0-31,可以编程0-255,我们刚刚收到的最新型号被锁定STX / ETX尺寸

这就是为什么我选择了那些在我的经验,到目前为止,其唯一的共同点。
乍得Z。豪尔,又名葛根
"编程是一种艺术形式的还击"

我的技术资料:
{A}

我的博客:
评论会员:游客 时间:2012/02/07
Jedrzejj:我没有做任何条形码扫描仪,但将承担某种COMS串口等等,从扫描仪读取我在这篇文章中看到的ZIP2鼠标处理程序,在一个WPF窗口。我在想什么,扫描仪输入到哪里发挥作用?并非屁股诚实的,我只是没有得到它。你能告诉我吗?萨沙理发微软的VisualC#MVP20082011CodeprojectMVP2008-2011Open源码{A5的}你最好的朋友就是你。我是我最好的朋友。我们有着相同的看法,并未落认为我的博客:{A6的}
Irwan哈桑
评论会员:游客 时间:2012/02/07
最旧的扫描仪是PS2的楔子。他们之间的键盘和PC键盘上的电缆连接。大多数较新的扫描仪是USB接口。只有少数是串行的。在WPF应用程序的事件,键盘事件,鼠标事件。乍得Z。豪尔,又名葛根"编程是一种艺术形式的还击"我的技术资料:{A}我的博客:{A2}
rubiwachs
评论会员:游客 时间:2012/02/07
对不起,我的意思的关键事件,我仍明显不理解为你做了什么意义,我就足够了。因此,我会低头,我想。感谢您试图让我明白,但萨沙理发微软的VisualC#MVP20082011CodeprojectMVP2008-2011Open源码{A5的}你最好的朋友就是你。我是我最好的朋友。我们有着相同的看法,并未落认为我的博客:{A6的}
Slacker007
评论会员:游客 时间:2012/02/07
喜萨沙,大多数条码扫描仪,只是作为一个键盘。当操作员扫描条形码,它的值发送到计算机的一系列字母数字,就好像它已手动标准键盘上输入。我指的是按值通常只是下面的条码的垂直线显示的数字。例如这是我包瑞兹拉50973613。聚苯乙烯。真的挖了你的任务系列文章。很酷的东西,刚开始他们来解决我的头...欢呼声中,保罗
MrDeej:即通常扫描仪和键盘看起来是一样的,是无法区分的。此代码可以让你知道时条码扫描仪与键盘发送数据。当作键盘,它允许用户输入的数据在错误的地方和doenst允许自动应答。
乍得Z。豪尔,又名葛根
"编程是一种艺术形式的还击"

我的技术资料:
{A}

我的博客:
{A2} :托德・史密斯
评论会员:游客 时间:2012/02/07
优秀文章!很好的分析问题。帮了我很多到我的项目中采用条形码扫描仪。多谢了!最好的问候,安迪