之前在18年写过一个使用c#捕获usb扫描枪扫描二维码、条形码结果,当时我是没有遇到需要使用中文的情况,因为二维码都是我自己控制生成的,如果遇到中文,我会提前进行编码编程unicode编码,所以,没有专门针对中文符号做支持

但一年多以来,不少人询问,或者在博客下留言,提出了中文扫码支持的需要,于是老顾就从新把程序从故纸堆里翻了出来,毕竟很久没弄这个了,还得自己重新读一遍代码,真晕。。。。。

好在,中文支持已经实现了

        public class ScanerCodes{private int ts = 500; // 指定输入间隔为500毫秒以内时为连续输入private List<List<EventMsg>> _keys = new List<List<EventMsg>>();private List<int> _keydown = new List<int>();   // 保存组合键状态private List<string> _result = new List<string>();  // 返回结果集private List<string> _alt = new List<string>();     // 保存alt按下时的各键位private DateTime _last = DateTime.Now;private byte[] _state = new byte[256];private string _key = string.Empty;private string _cur = string.Empty;public EventMsg Event{get{if (_keys.Count == 0){return new EventMsg();}else{return _keys[_keys.Count - 1][_keys[_keys.Count - 1].Count - 1];}}}public List<int> KeyDowns{get{return _keydown;}}public DateTime LastInput{get{return _last;}}public byte[] KeyboardState{get{return _state;}}public int KeyDownCount{get{return _keydown.Count;}}public string Result{get{if (_result.Count > 0){return _result[_result.Count - 1].Trim();}else{return null;}}}public string CurrentKey{get{return _key;}}public string CurrentChar{get{return _cur;}}public bool isShift{get{return _keydown.Contains(160) || _keydown.Contains(161);}}public bool isAlt{get{return _keydown.Contains(164) || _keydown.Contains(165);}}public bool isControl{get{return _keydown.Contains(162) || _keydown.Contains(163);}}public void Clear(){_keys.Clear();_result.Clear();}public void Add(EventMsg msg){#region 记录按键信息// 首次按下按键if (_keys.Count == 0){_keys.Add(new List<EventMsg>());_keys[0].Add(msg);_result.Add(string.Empty);}// 未释放其他按键时按下按键else if (_keydown.Count > 0){_keys[_keys.Count - 1].Add(msg);}// 单位时间内按下按键else if (((TimeSpan)(DateTime.Now - _last)).TotalMilliseconds < ts){_keys[_keys.Count - 1].Add(msg);}// 从新记录输入内容else{_keys.Add(new List<EventMsg>());_keys[_keys.Count - 1].Add(msg);_result.Add(string.Empty);}if (_keys.Count > 10){_keys.RemoveAt(0);}#endregion_last = DateTime.Now;#region 获取键盘状态// 记录正在按下的按键if (msg.paramH < 128 && !_keydown.Contains(msg.message)){_keydown.Add(msg.message);}// 清除已松开的按键if (msg.paramH > 127 && _keydown.Contains(msg.message)){_keydown.Remove(msg.message);}#endregion#region 计算按键信息int v = msg.message & 0xff;int c = msg.paramL & 0xff;StringBuilder strKeyName = new StringBuilder(500);if (GetKeyNameText(c * 65536, strKeyName, 255) > 0){_key = strKeyName.ToString().Trim(new char[] { ' ', '\0' });GetKeyboardState(_state);if (_key.Length == 1 && msg.paramH < 128){// 根据键盘状态和shift缓存判断输出字符_cur = ShiftChar(_key, isShift, _state).ToString();_result[_result.Count - 1] += _cur;}else if (msg.paramH < 128 && isAlt){_alt.Add(_key);}else if (msg.paramH > 127 && (msg.message == 164 || msg.message == 165)){string composite = string.Empty;for (int i = 0; i < _alt.Count; i++){composite += _alt[i];}composite = Regex.Replace(composite, @"[^0-9]+", "");string hex = Convert.ToInt32(composite).ToString("x");if (hex.Length % 2 == 1){hex = "0" + hex;}string str = Regex.Replace(hex, @"([0-9a-f]{2})", "%$1");_cur = System.Web.HttpUtility.UrlDecode(str, Encoding.GetEncoding(936));_result[_result.Count - 1] += _cur;_alt.Clear();}else{_cur = string.Empty;}}#endregion}private char ShiftChar(string k, bool isShiftDown, byte[] state){bool capslock = state[0x14] == 1;bool numlock = state[0x90] == 1;bool scrolllock = state[0x91] == 1;bool shiftdown = state[0xa0] == 1;char chr = (capslock ? k.ToUpper() : k.ToLower()).ToCharArray()[0];if (isShiftDown){if (chr >= 'a' && chr <= 'z'){chr = (char)((int)chr - 32);}else if (chr >= 'A' && chr <= 'Z'){chr = (char)((int)chr + 32);}else{string s = "`1234567890-=[];',./";string u = "~!@#$%^&*()_+{}:\"<>?";if (s.IndexOf(chr) >= 0){return (u.ToCharArray())[s.IndexOf(chr)];}}}return chr;}}

说起来,其实也没有修改很多东西,只对ScanerCodes这个类做了下微调,其他代码我就不再复制过来了,请参考原文

以下是中文支持的思路和尝试过程

首先,根据原文中不吃辣的阿银同学提出的问题,左右shift键paramH值不同的问题专门测试了一下,发现的确存在这种问题

那么第一步就是调整isShift,这里有个测试结果,有兴趣继续魔改的可以看一下

paramH,message
0,160   // Lshift down
128,160 // Lshift up
1,161   // Rshift down
129,161 // Rshift up
0,162   // Lctrl down
128,162 // Lctrl up
1,163   // Rctrl down
129,163 // Rctrl up
32,164  // Lalt down
128,164 // Lalt up
33,165  // Ralt down
129,165 // Ralt up

我这里使用的还是科密扫描枪,如果其他型号扫描枪有不同的结果,请自行尝试

isShift修改为判断已按下的键中,是否存在左右shift键对应的编号

然后,尝试进行中文扫码,直接一脸懵逼了。。。。所有的_key得到的结果都是长度大于1的内容,这都什么和什么啊,然后发现捕捉到了32,164的组合,这不是按alt键了吗?一脸疑惑中。。。。

然后通过调试发现,之后的键盘信息_key给我的是 Numpad 4,Numpad 5,Numpad 7,Numpad 9,Numpad 4。。。。。。

一脸惊讶!我是知道按住alt不送,直接在数字小键盘上输入数字可以出现任意符号的,难道扫描枪扫到中文也是这么搞得?

直接用数字小键盘尝试了下Alt+45794。。。。出现了一个“测”字,好吧。。。。这个是我生成的二维码。。。。。

那么有了这个结果,后边就相对简单了,直接加一个状态,isAlt,嗯,顺便支持左右Alt

然后重新定义一个数组_alt,用来记录alt键释放前的所有键盘信息

最后,在alt键释放的时候将_alt数组中的信息组合起来,得到小键盘数字顺序,并清空_alt数组,以便下一次继续获取中文符号

好了,得到了数字后就需要把数字转成中文了,然后当我使用(char)45794转出来的内容是个韩文字符的时候,我差点崩溃了。。。NND,扫描枪居然有字符集设置,而不是使用的unicode!

行吧,如果有人购买的扫描枪在数字转字符时不对,那一定是编码的锅,自己测试到底是什么编码吧!

于是,我就将数字转成16进制,然后补%,冒充urldecode的结果,然后使用gb2312进行urldecode,得到了正确结果,中文支持完成

使用c#捕获usb扫描枪扫描二维码、条形码结果(支持中文版)相关推荐

  1. Android基于Google Zxing实现二维码/条形码扫描、生成二维码/条形码

     二维码/条形码生成器 二维码/条形码扫描器 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有,还有分 ...

  2. 安卓,Android,Scanner Gun,Barcode Scanner,条码,扫描枪,二维码,键盘模式

    安卓对接扫码枪,扫码枪模拟键盘输入 方案一 在页面添加个隐藏的input 框,在input框内获取值,来得到扫码枪的值. 获取焦点,软键盘弹出不易隐藏. 方案二 标准扫描枪扫描数据会触发KEYCODE ...

  3. USB条码枪读取二维码

    扫描枪是键盘输出,也就是说拖个文本框,让文本框有焦点,就能直接输出到你的文本框内了. 如读取内容后,显示在文本框控件 IDC_SCANGUN 上: void Dlg::OnShowWindow(BOO ...

  4. iOS 扫描二维码/条形码

    级别:★★☆☆☆ 标签:「iOS 原生扫描」「AVCaptureSession」「AVCaptureDevice」「rectOfInterest」 作者: Xs·H 审校: QiShare团队 最近做 ...

  5. 77、基于STM32单片机的超市餐饮二维码/条形码摄像头识别结账扫码系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.程序源码 七.资料包括 摘要 二维码识别系统是集数据采集,识别,以及显示 ...

  6. Android PAD扫描枪扫描二维码条形码

    Android PAD扫描枪扫描二维码条形码 1,目前扫描条码只有通过按键触发,按下按键会发送F12的键值,可以通过监听F12键判断是否触发扫描 2,扫到的条码我们会在当前光标处显示出来,同时也发了一 ...

  7. 微信公众号扫描带参数二维码实现自动分组?

    2019独角兽企业重金招聘Python工程师标准>>> 最近很多人都在问微信公众号扫描带参数二维码实现自动分组,通过微号帮平台操作实现,这个功能不止如此,微信二维码来源统计分析.微信 ...

  8. Android 比Zing 更快的二维码 条形码扫描Zbar

    之前项目要用做二维码 条形码的扫描 找资料 大多都是Zing 的,但是 zing 扫描比较慢 而且经常扫描半天不出来 ,如果是近距离的人话根本不行, 体验很差 ,最主要还可能是对zing 的理解不够透 ...

  9. 微信小程序扫描二维码条形码 (wx.scanCode)

    前言 在业务中遇到需要获取商品的二维码的信息返回商品的二维码信息,在调用后台的接口,首先想到用小程序的Api,wx.scanCode(Object object)获取二维码信息. 支持相机扫描或者相册 ...

  10. 二维码的扫描和生成二维码

    前言 之前自己一直想要去实现一个二维码的扫描和生成,但是一直拖到现在,今天趁着夜色落幕,气氛还算可以(各种声音的夹杂中),完成了这个扫描和生成二维码的工具,在这里总结一下. 首先普及一下什么是二维码和 ...

最新文章

  1. 第三篇——第二部分——第三文 配置SQL Server镜像——域环境
  2. 大学计算机组装与维修考试题,【校选修】计算机组装与维修 考试题
  3. ABAP xml handling via SAX - 在ABAP里另一种处理xml的机制介绍
  4. Linux下的屏保设置 xset s 与 xset dpms
  5. Android Studio(九):引用jar及so文件
  6. H5 获取连接参数,判断是否是手机端
  7. linux ping不允许的操作,Alpine ping:不允许操作
  8. 设置NumericStepper控件不可用状态的字体颜色。
  9. 我的blog终于开通了!
  10. 管理新语:主管要辅导员工转正
  11. 获取CPU、硬盘、主板序列号及MAC地址工具类
  12. 10个T的硬盘都装不下,这几个资源网站的优质资源真的超多
  13. 亚马逊网络关联是什么
  14. 爬山的蜗牛旅程:java内存结构
  15. 基于python的可视化分析_Python数据的可视化分析,python
  16. 数据库课程设计——学生信息管理系统
  17. Qt可视化大屏电子看板系统源码
  18. 反驳李刚的针对我吐槽的回应,曝光疯狂java李刚的骗子行径
  19. Capture Allegro学习笔记1
  20. Berkeley DB JE 学习笔记

热门文章

  1. 《转》Vmware vSphere常见问题汇总
  2. B - Bitwise Exclusive-OR Sequence
  3. Mark loves cat
  4. 20160226.CCPP体系详解(0036天)
  5. 第二弹!python爬虫批量下载高清大图
  6. Lamber表达式 List,Map,Set 互相转换
  7. 【编译问题】海思3559A编译问题 texi2dvi:命令找不到
  8. 2021人工智能原理与算法(国科大张文生老师主讲)
  9. java9推迟_甲骨文宣布Java 9将会推迟到明年7月发布
  10. 软件架构模式 mark Richards - 读后总结 4 - 微服务架构