USB扫码枪二维码读取(一)——U3D篇
USB扫码枪为即插即用,通过类似键盘的方式和系统进行交互,扫描出来的数据获取方式有两种实现方式。
(1)文本框输入获取焦点,扫描后自动显示在文本框内。
(2)使用键盘钩子,勾取扫描枪虚拟按键,进行键盘虚拟码和ASCII码的转换后获取数据。
在程序进行开发时,一般使用第二种方式,下面在U3D开发环境下,接收USB扫码枪扫描数据方面的问题进行探讨分享。
在程序开发中要实现系统钩子其实很简单,调用Win32的API即可。
(1)SetWindowsHookEx 用于设置钩子。(设立一道卡子,盘查需要的信息)
private static IntPtr SetHook(LowLevelKeyboardProc proc){using (Process curProcess = Process.GetCurrentProcess())using (ProcessModule curModule = curProcess.MainModule){return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);}}
(2)CallNextHookEx 用于传递钩子(消息是重要的,所以从哪里来,就应该回到哪里去,除非你决定要封锁消息)
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam){return CallNextHookEx(_hookID, nCode, wParam, lParam);}
(3)UnhookWindowsHookEx 卸载钩子(卸载很重要,卡子设多了会造成拥堵)
void OnApplicationQuit(){UnhookWindowsHookEx(_hookID);}
最重要的环节有两个:
一是对接收到的一个个键盘数值的处理。
我的扫码枪设置后扫码的情况举例如下:
(1)在大写字母前发送shift的虚拟码160
(2)第二功能键发送shift加对应的虚拟码
(3)结束发送键盘码为13 40
如:160 187 对应的为键盘的+,ASCII码为43
160 65 对应的为键盘的A ,ASCII码为65
需要处理shift对应的大小写问题,以及第二功能键的特殊处理;
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam){bool isShift = false;if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN){int vkCode = Marshal.ReadInt32(lParam);// UnityEngine.Debug.Log("ASCII:" + vkCode);if (vkCode >= 65 && vkCode <= 90)vkCode = vkCode + 32;//处理为小写字母if (myHook.m_hInstance.vkCodeLast == 160){if (vkCode >= 48 && vkCode <= 57 ){if(vkCode==48)vkCode= 41;//)else if (vkCode == 49)vkCode = 33; //!else if (vkCode == 50)vkCode = 64;// @else if (vkCode == 51)vkCode = 35;//#else if (vkCode == 52)vkCode = 36;//$else if (vkCode == 53)vkCode = 37;//%else if (vkCode == 54)vkCode = 94;//^else if (vkCode == 55)vkCode = 38;//&else if (vkCode == 56)vkCode = 42;//*else if (vkCode == 57)vkCode = 40;//)else if (vkCode == 189)vkCode = 95;//_else if (vkCode == 187)vkCode = 43;//+}else if (vkCode >= 97 && vkCode <= 122)vkCode = vkCode - 32;//为大写字母if (vkCode == 186)//:{vkCode = 58;}else if (vkCode == 187)vkCode = 43;//+else if (vkCode == 189)vkCode = 95;//-else if (vkCode == 190)vkCode = 62;//>else if (vkCode == 191)vkCode = 63;//?else if (vkCode == 219)vkCode = 123;//{else if (vkCode == 220)vkCode = 124;//|else if (vkCode == 221)vkCode = 125;//}}if (vkCode == 186)// ;{vkCode = 59;}if (vkCode == 187)// ={vkCode = 61;}if (vkCode == 189)// -{vkCode = 45;}if (vkCode == 190)//.{vkCode = 46;}if (vkCode == 191)// /{vkCode = 47;}if (vkCode == 219)vkCode = 91;//[if (vkCode == 220)vkCode = 92;//\if (vkCode == 220)vkCode = 93;//]if (vkCode == 109)// 数字键-{vkCode = 45;}if (vkCode == 13){myHook.m_hInstance._result.Add("\r\n");}if (vkCode != 160 && vkCode!=13&&vkCode != 40){myHook.m_hInstance.lenNow++;string alpha = Convert.ToChar(vkCode).ToString();myHook.m_hInstance._result.Add(alpha);}myHook.m_hInstance.vkCodeLast = vkCode;}return CallNextHookEx(_hookID, nCode, wParam, lParam);}
二是扫码结束的判断。
程序中对接收到13回车的键盘码为结束的判断标志,收到后添加"\r\n"作为判断标志。
public static string getRet(){string s = string.Join("", myHook.m_hInstance._result.ToArray()); if (s.EndsWith("\r\n")){myHook.m_hInstance._result.Clear();return s.Trim();}else{return "";} }
我的处理测试代码U3D中使用(C#)在这里
使用时
string str = myHook.getRet();即可
USB扫码枪二维码读取(一)——U3D篇相关推荐
- USB扫码枪二维码读取(二)——MFC篇
USB扫码枪为即插即用,通过类似键盘的方式和系统进行交互,在MFC中进行处理比较方便,对键盘消息进行处理即可. (1)文本框输入获取焦点,扫描后自动显示在文本框内. (2)在PreTranslateM ...
- 解决自动分析仪条码二维码读取的方案
随着物联网技术的发展,越来越多的企业开始采用条码二维码读取技术来提高企业的生产效率和管理水平.条码二维码读取技术可以帮助企业自动识别和跟踪物品,从而提高企业的生产效率和管理水平.用于检查体液或组织部位 ...
- 扫描二维码读取文档_使用深度学习读取和分类扫描的文档
扫描二维码读取文档 To many people's dismay, there is still a giant wealth of paper documents floating out the ...
- 二维码读取之2d_data_codes_rectify_symbol.hdev
*这个实例展示了如何读取一个经过修正的倾斜的条码 This program demonstrates how to read a slanted 2d data code by preprocessi ...
- 二维码读取之ecc200_simple.dev
*在这个实例中,演示了如何读取Data Matrix ECC 200的条码,第一步呢就是,创建一个二维码读取器,在图形窗口中显示结果 This example program demonstrates ...
- 视觉检测应用之电路板二维码读取
5G时代的到来,对广大电路板企业的研发.生产以及管理能力提出了更高的要求,企业须以更快的速度向市场提供更具有成本效益的产品,提升产品管理追溯效率也是其中非常重要的一环.在电路板上标记字符.图案.一维码 ...
- 二维码读取之PDF_417_bottle.hdev
*本例子展示了如何读取PDF 417的条码 This programs shows how to read 2d data codes of type PDF 417. 关闭更新 dev_update ...
- 二维码读取之ecc200_small_modules_robustness.hdev
*这个实例演示了如何读取非常小的ECC200二维码 This example program shows how to find and decode ECC200 symbols that have ...
- 二维码读取之ecc200_contrast_tolerance.hdev
*这个示例程序演示了contrast_tolerance(对比差异,也就是在某些场合检测表面对比度不均匀情况下需要这个参数) *这个参数对条码读取效果的影响 This example demonstr ...
最新文章
- java二维码生成与解析代码实现
- JAVA中使用XFire调用WebService接口
- c语言多种选,教你轻松学会C语言系列之——一种更简洁、更经典的选择结构
- 梯度反传_反事实政策梯度解释
- 云+X案例展 | 民生类:京东云突破数据中心光互联瓶颈
- SQL事务控制语言(TCL)
- 电子工程专业评副高总结_微电子科学与工程专业怎么样?
- 数据科学在风控中的应用-笔记
- uboot网络调试方法
- loadrunner 打印变量
- Markdown插入代码
- UI自动化 win32 模拟键盘按键
- 3D打印路径填充算法 -- Connected Fermat Spirals for Layered Fabrication
- 2019重新起航:搭建个人博客
- 佳能计算机使用方法,佳能扫描仪怎么用?佳能扫描仪使用方法
- webpack css中字体文件路径问题
- MarGo: Missing required environment variables: GOROOT GOPATH See the `Quirks` section of USAGE.md fo
- win10安装msi文件
- TensorFlow实践(15)——使用tf.device方法指定节点执行设备
- weblogic 启动报错bea 000386解决方案
热门文章
- 主板修改BIOS装联想XP(附改好的文件
- “图片差异检查”辅助工具(即“大家来找茬”辅助工具)源码分享
- raw文件 linux,Linux下处理(包括raw,HDR)和管理照片软件介绍
- android更新UI(界面)的方法;android刷新界面数据的方法;android定时器更新界面
- 1款免费炫酷的javaweb版报表工具
- 腾讯面试官:矩阵中的路径怎么求?
- 热部署工具jrebel-and-xrebel-for-intellij使用方法
- c++编程关机重启 非常快捷实用
- R语言常用快捷键、excel操作、绘制、统计
- 53、RK3588测试视频编解码和 POE OAK Camera编码结合开发