项目源码分享之[条码扫描后台监控程序]

接下来我会整理一些做过的项目, 并将其中有通用性的代码开源出来, 如果有谁碰巧有这样的需求, 可以拿过去用就行了.

项目背景:

工人使用加工中心(数控机床)加工工件时, 需要根据工件的型号, 然后在用户界面上浏览找到对应的NC文件, 然后加工中心加载这个NC文件, 完成工件加工. 该加工中心的操作系统是Windows.

问题是: 在加工中心上找文件, 因为键盘的缘故很不方便, 同时NC文件又特别多, 容易找错文件.

我给出的方案是: 使用扫描枪, 条码为工件的型号, 通过型号和NC文件的映射关系, 可以得到NC文件名, 然后控制原有加工程序加载指定的NC文件.

难点是: 加工中心操作系统是那种深度定制的Windows程序, 同时只能有一个窗口程序运行, 所以不能再做一个Window Form来接收条码值. 所以我开发了一个后台程序, 既然是后台程序, 即需要在后台监控扫描枪, 就有了下面这个BarcodeScanMonitor源码了.

源码和文档:

http://git.oschina.net/harrychinese/delphi_utils/tree/master/Barcode

文档介绍见: http://git.oschina.net/harrychinese/delphi_utils/blob/master/Barcode/usage.md

BarcodeScanMonitor 介绍

功能:

监控扫描枪的扫描动作.即使我们的程序不是Windows的当前活动程序, 也可以监控到.

原理:

采用Keyboard hook的方式实现监控. 其实扫描枪扫描的过程相当于键盘快速输入一段文字, 最后的回车相当于扫描结束

测试方法:

如果没有扫描枪, 可使用大键盘模拟, 但不能使用小键盘.

已知问题:

由于采用了消息hook机制, 监控的结果并不会百分百准确, 表现为: 数字有时会错位, 有时会重复, 有时会丢掉一位,
如果准确度要求高, 有两种方法: 1.[已实现]为扫描枪设置扫描前缀和后缀, 用作验证, 如果监控的结果不包含这对前缀/后缀, 即舍弃监控结果. 2.[未实现]根据条码本身的验证算法, 对监控的结果进行验证

使用方法:

初始化 TBarcodeScanMonitor 实例, 然后设置必要的属性, 比如barcode的可能长度, barcode扫描最大耗时; 然后为扫描结束动作绑定一个事件; 最后启动扫描监控. 在你的扫描结束事件中, 就可以取到barcode值了.

sample code :

    FBarReader:=TBarcodeScanMonitor.GetInstance();
    FBarReader.RelayKeyPress:=True;//按键被捕获后, 是否要继续将按键显示出来
    FBarReader.BarcodeLengths:='3,4'; //条码可能的长度
    FBarReader.ScanMaxDurationSecond:=10;//扫描条码的最大耗时
    FBarReader.AlwaysDuplicatedRead:=False; //防止条码值重复
    FBarReader.CheckPrefixStr:=''; //前缀验证码
    FBarReader.CheckSuffixStr:='';//后缀验证码
    FBarReader.AutoRemoveCheckStr:=True;
    FBarReader.HookedThreadId:=0; //0为OS级别的键盘hook
    FBarReader.OnScanFinished:=self.OnScanFinished1; //绑定一个扫描结束的事件
    if FBarReader.StartListenScan()=False then  //开始监听键盘
    begin
        Msg:= 'Barcode scanner failed to listen';
        Application.MessageBox(PChar(Msg),'Init failure',MB_OK+MB_ICONSTOP);
    end;                
posted @ 2013-07-21 12:50  harrychinese  阅读(1235)  评论(1编辑  收藏  举报