接下来我会整理一些做过的项目, 并将其中有通用性的代码开源出来, 如果有谁碰巧有这样的需求, 可以拿过去用就行了.
项目背景:
工人使用加工中心(数控机床)加工工件时, 需要根据工件的型号, 然后在用户界面上浏览找到对应的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;