【目前的条形码扫描器有点类似外接键盘(其实从消息传送上它就相当于一个键盘),把输入焦点定位到可输入的控件上,一扫描相应的条形码信息就输入到文本框中去了,但是如果没有输入焦点,或另一个不相干的程序获得输入焦点,那就有点乱套了。我想实现的是,不管什么情况,只要扫描器一工作,我的程序就能自动激活,并能获得当前输入的条形码信息。 实现思路:我用的是litele牌的USB口的红外条形码扫描器,仔细分析了一下,扫描成功后,以键盘按键消息的形式把条形码输入信息通知给系统。这样通过键盘钩子就可以方便的获得该信息了。但是,怎样区分信息是键盘还是条形码输入的哪?很简单,条形码扫描器在很短的时间内输入了至少3个字符以上信息,并且以“回车”作为结束字符,在这种思想指引下,很完美的实现了预定功能。】

frmMain:

        public BarCodeHook BarCode = new BarCodeHook();public delegate void ShowInfoDelegate(BarCodeHook.BarCodes barCode);void ShowInfo(BarCodeHook.BarCodes barCode){textBox_barCode.Text = barCode.BarCode;buttonX2.Focus();}public void BarCode_BarCodeEvent(BarCodeHook.BarCodes barCode){ShowInfo(barCode);}public frmMain(){InitializeComponent();BarCode.BarCodeEvent += new BarCodeHook.BarCodeDelegate(BarCode_BarCodeEvent);}

如果焦点本来就在textBox上,会产生多余的字符,所以在showInfo函数里,每次都手动让buttonX2成为焦点。

 public class BarCodeHook{public delegate void BarCodeDelegate(BarCodes barCode);public event BarCodeDelegate BarCodeEvent;public struct BarCodes{public int VirtKey;      //虚拟码public int ScanCode;     //扫描码public string KeyName;   //键名public uint AscII;       //AscIIpublic char Chr;         //字符public string BarCode;   //条码信息public bool IsValid;     //条码是否有效public DateTime Time;    //扫描时间}private struct EventMsg{public int message;public int paramL;public int paramH;public int Time;public int hwnd;}[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern bool UnhookWindowsHookEx(int idHook);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);[DllImport("user32", EntryPoint = "GetKeyNameText")]private static extern int GetKeyNameText(int lParam, StringBuilder lpBuffer, int nSize);[DllImport("user32", EntryPoint = "GetKeyboardState")]private static extern int GetKeyboardState(byte[] pbKeyState);[DllImport("user32", EntryPoint = "ToAscii")]private static extern bool ToAscii(int VirtualKey, int ScanCode, byte[] lpKeyState, ref uint lpChar, int uFlags);delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);BarCodes barCode = new BarCodes();int hKeyboardHook = 0;public string strBarCode = "";public int length;private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){barCode.IsValid = false;bool notChar = false;if (nCode == 0){EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));if (wParam == 0x100)   //WM_KEYDOWN = 0x100{barCode.VirtKey = msg.message & 0xff;  //虚拟码barCode.ScanCode = msg.paramL & 0xff;  //扫描码StringBuilder strKeyName = new StringBuilder(255);if (GetKeyNameText(barCode.ScanCode * 65536, strKeyName, 255) > 0){barCode.KeyName = strKeyName.ToString().Trim(new char[] { ' ', '\0' });}else{barCode.KeyName = "";}byte[] kbArray = new byte[256];uint uKey = 0;GetKeyboardState(kbArray);if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey, 0)){barCode.AscII = uKey;barCode.Chr = Convert.ToChar(uKey);}else{notChar = true;   //转到ascii字符失败,这不是一个正常字符,要去掉}if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds > 30)     //30ms可以过滤掉连续按住一个键时的情况{if (notChar == false)strBarCode = barCode.Chr.ToString();elsestrBarCode = "";barCode.IsValid = false;}else{if (strBarCode.Length >= 5)  {barCode.IsValid = true;      //isValid为true表明这是个条码}if (notChar == false){strBarCode += barCode.Chr.ToString();}barCode.BarCode = strBarCode;}barCode.Time = DateTime.Now;if (BarCodeEvent != null && barCode.IsValid) BarCodeEvent(barCode);    //触发事件}}return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);          }// 安装钩子 public bool Start(){if (hKeyboardHook == 0){//WH_KEYBOARD_LL = 13hKeyboardHook = SetWindowsHookEx(13, new HookProc(KeyboardHookProc), Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);}return (hKeyboardHook != 0);}// 卸载钩子 public bool Stop(){if (hKeyboardHook != 0){bool result = UnhookWindowsHookEx(hKeyboardHook);hKeyboardHook = 0;         //将hKeyboardHook 置为0if (result){//MessageBox.Show("true");}return result;}return true;}}

是如果扫到的是英文字符的话,会有一个多余的码无法从键盘码转到ascii码,需要去掉这个码。同时设为30ms可以过滤掉一直按住一个键的情况。

C#下usb条码扫描枪的钩子实现的改进相关推荐

  1. linux下usb驱动编写

    linux下usb驱动编写(内核2.4)--2.6与此接口有区别2006-09-15 14:57我们知道了在Linux下如何去使用一些最常见的USB设备.但对于做系统设计的程序员来说,这是远远不够的, ...

  2. Linux下USB suspend/resume源码分析【转】

    转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...

  3. usb linux 内核,Linux下USB内核之学习笔记

    Linux下USB子系统软件结构为 USB 内核(USB驱动,USBD )处于系统的中心,对于它进行研究是能够进行USB驱动开发(包括客户驱动和主机驱动)的第一步.它为客户端驱动和主机控制器驱动提供了 ...

  4. 无线鼠标计算机不识别,win7系统下USB无线鼠标电脑检测不到如何解决

    许多win7系统用户都喜欢使用usb无线鼠标,然而有时候可能会遇到sub无线鼠标电脑检测不到的情况,碰到这样的问题该怎么办呢,本文就给大家讲解一下win7系统下USB无线鼠标电脑检测不到的具体解决步骤 ...

  5. linux配置usb主从_一种Linux下USB设备主从切换的实现

    龙源期刊网 http://www.qikan.com.cn 一种 Linux 下 USB 设备主从切换的实现 作者:侯景昆 来源:<电子技术与软件工程> 2013 年第 22 期 摘 要 ...

  6. linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...

    解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点 2018-09-19 http://blog.sina.com.cn/s/blog_8b58097f0102wx ...

  7. kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】

    转自:http://blog.chinaunix.net/uid-26349264-id-4455634.html 目录 kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 ...

  8. usb设备检测linux,Linux下USB设备检测全教程(转)

    Linux下USB设备检测全教程(转)[@more@] USB设备检测也是通过/proc目录下的USB文件系统进行的.为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块.在检测开始 ...

  9. 计算机usb口不识别读卡器,windows7系统下usb读卡器读不出来如何解决

    最近有windows7系统用户到本站反馈说碰到这样一个情况,就是在使用读卡器传输文件的时候,发现插入到电脑出现无法识别读卡器的情况,该怎么办呢,针对windows7系统下usb读卡器读不出来这个问题, ...

最新文章

  1. usb转ttl小板pl2303hx_TTL刷机经验分享,刷机后实现软件随便安装,电视直播免费看...
  2. ADS与RealView MDK
  3. python isinstance函数判断object的类型
  4. SQL Server密码爆破工具SQLdict
  5. python︱HTML网页解析BeautifulSoup学习笔记
  6. RocketMQ初探(五)之RocketMQ4.2.6集群部署(单Master+双Master+2m+2s+async异步复制)
  7. 各种有用的东西留言板
  8. Linux日志高频使用命令
  9. 实际操作更改Linux启动模式
  10. failed to read artifact descriptor for xx
  11. 耿国华c语言程序设计,C语言程序设计课程教学探究.doc
  12. Google GPS在Android上的一些应用
  13. Error of Git
  14. MOSS2007匿名调查列表使用分页符导致的错误分析
  15. win2008 server 多IP配置
  16. handsome主题添加服务器信息,Typecho handsome主题一言接口修改,使用自己的一言服务...
  17. C语言选择题知识点整理
  18. 【有利可图网】PS实战教程25:巧用PS设计制作滑落一半的海报
  19. 04、【电脑维修】Win 10重新安装微软商店以及便筏打不开问题
  20. 单引号,双引号,转义

热门文章

  1. 什么区块链,统统都是骗局?
  2. tomcat源码解读(一)
  3. 第二章:第一节数据清洗及特征处理-自测
  4. 一些融会贯通的知识点----持续更新
  5. 新店速递丨白玉兰(商务)酒店赣榆吾悦广场店 正式上线
  6. 用户注册登录页面的设计与实现
  7. Java爬虫之利用Jsoup+HttpClient爬取类叔叔不约匿名聊天网站的图片,未果——后爬取某网站美女图片案例
  8. 【C语言典例】——day4:加油站加油【Switch】
  9. 数据库常用操作,会持续更新
  10. 四方光电扬尘传感器PM3006助力打赢蓝天保卫战