红外条码扫描器的另类使用C#版.doc_第1页
红外条码扫描器的另类使用C#版.doc_第2页
红外条码扫描器的另类使用C#版.doc_第3页
红外条码扫描器的另类使用C#版.doc_第4页
红外条码扫描器的另类使用C#版.doc_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

红外条码扫描器的另类使用C#版 3年前写了一篇USB口的红外条形码扫描器的另类使用,不过相关代码是VB编写,在这几年之间,有许多网友提出需要C#版的,起初还以为由VB修改C#应该很容易,最近研究了一下,发现C#和VB调用API的机制还是有所不同的,在迁移的过程中还是会遇到不少问题,所以我专门抽时间做了一个基于C#的程序。 【目前的条形码扫描器有点类似外接键盘(其实从消息传送上它就相当于一个键盘),把输入焦点定位到可输入的控件上,一扫描相应的条形码信息就输入到文本框中去了,但是如果没有输入焦点,或另一个不相干的程序获得输入焦点,那就有点乱套了。我想实现的是,不管什么情况,只要扫描器一工作,我的程序就能自动激活,并能获得当前输入的条形码信息。 实现思路:我用的是litele牌的USB口的红外条形码扫描器,仔细分析了一下,扫描成功后,以键盘按键消息的形式把条形码输入信息通知给系统。这样通过键盘钩子就可以方便的获得该信息了。但是,怎样区分信息是键盘还是条形码输入的哪?很简单,条形码扫描器在很短的时间内输入了至少3个字符以上信息,并且以“回车”作为结束字符,在这种思想指引下,很完美的实现了预定功能。】 VB相关的代码请见:/yefanqiu/archive/2006/08/30/1144881.aspx 窗体相关代码:view plaincopy to clipboardprint?1020304050607080901001101201301401501 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.Forms; 8 9 namespace ReadBadCode 10 11 public partial class frmTest : Form 12 13 BarCodeHook BarCode = new BarCodeHook(); 14 public frmTest() 15 16 InitializeComponent(); 17 BarCode.BarCodeEvent += new BarCodeHook.BarCodeDelegate(BarCode_BarCodeEvent); 18 19 20 private delegate void ShowInfoDelegate(BarCodeHook.BarCodes barCode); 21 private void ShowInfo(BarCodeHook.BarCodes barCode) 22 23 if (this.InvokeRequired) 24 25 this.BeginInvoke(new ShowInfoDelegate(ShowInfo), new object barCode ); 26 27 else 28 29 textBox1.Text = barCode.KeyName; 30 textBox2.Text = barCode.VirtKey.ToString(); 31 textBox3.Text = barCode.ScanCode.ToString(); 32 textBox4.Text = barCode.AscII.ToString(); 33 textBox5.Text = barCode.Chr.ToString(); 34 textBox6.Text = barCode.IsValid ? barCode.BarCode : ; 35 36 37 38 void BarCode_BarCodeEvent(BarCodeHook.BarCodes barCode) 39 40 ShowInfo(barCode); 41 42 43 private void frmTest_Load(object sender, EventArgs e) 44 45 BarCode.Start(); 46 47 48 private void frmTest_FormClosed(object sender, FormClosedEventArgs e) 49 50 BarCode.Stop(); 51 52 53 private void textBox6_TextChanged(object sender, EventArgs e) 54 55 if (textBox6.Text.Length 0) 56 57 MessageBox.Show(textBox6.Text); 58 59 60 61 62 63 BarCodeHook 类:view plaincopy to clipboardprint?10203040506070809010011012013014015064 using System; 65 using System.Collections.Generic; 66 using System.Text; 67 using System.Runtime.InteropServices; 68 using System.Reflection; 69 70 namespace ReadBadCode 71 72 public class BarCodeHook 73 74 public delegate void BarCodeDelegate(BarCodes barCode); 75 public event BarCodeDelegate BarCodeEvent; 76 77 public struct BarCodes 78 79 public int VirtKey; /虚拟码 80 public int ScanCode; /扫描码 81 public string KeyName; /键名 82 public uint AscII; /AscII 83 public char Chr; /字符 84 85 public string BarCode; /条码信息 86 public bool IsValid; /条码是否有效 87 public DateTime Time; /扫描时间 88 89 90 private struct EventMsg 91 92 public int message; 93 public int paramL; 94 public int paramH; 95 public int Time; 96 public int hwnd; 97 98 99 DllImport(user32.dll, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall) 100 private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); 101 102 DllImport(user32.dll, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall) 103 private static extern bool UnhookWindowsHookEx(int idHook); 104 105 DllImport(user32.dll, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall) 106 private static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); 107 108 DllImport(user32, EntryPoint = GetKeyNameText) 109 private static extern int GetKeyNameText(int lParam, StringBuilder lpBuffer, int nSize); 110 111 DllImport(user32, EntryPoint = GetKeyboardState) 112 private static extern int GetKeyboardState(byte pbKeyState); 113 114 DllImport(user32, EntryPoint = ToAscii) 115 private static extern bool ToAscii(int VirtualKey, int ScanCode, byte lpKeyState, ref uint lpChar, int uFlags); 116 117 delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); 118 BarCodes barCode = new BarCodes(); 119 int hKeyboardHook = 0; 120 string strBarCode = ; 121 122 private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) 123 124 if (nCode = 0) 125 126 EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg); 127 128 if (wParam = 0x100) /WM_KEYDOWN = 0x100 129 130 barCode.VirtKey = msg.message & 0xff; /虚拟码 131 barCode.ScanCode = msg.paramL & 0xff; /扫描码 132 133 StringBuilder strKeyName = new StringBuilder(255); 134 if (GetKeyNameText(barCode.ScanCode * 65536, strKeyName, 255) 0) 135 136 barCode.KeyName = strKeyName.ToString().Trim(new char , 0 ); 137 138 else 139 140 barCode.KeyName = ; 141 142 143 byte kbArray = new byte256; 144 uint uKey = 0; 145 GetKeyboardState(kbArray); 146 if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey, 0) 147 148 barCode.AscII = uKey; 149 barCode.Chr = Convert.ToChar(uKey); 150 151 152 if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds 50) 153 154 strBarCode = barCode.Chr.ToString(); 155 156 else 157 158 if (msg.message & 0xff) = 13 & strBarCode.Length 3) /回车 159 160 barCode.BarCode = strBarCode; 161 barCode.IsValid = true; 162 163 strBarCode += barCode.Chr.ToString(); 164 165 166 barCode.Time = DateTime.Now; 167 if (BarCodeEvent != null) BarCodeEvent(barCode); /触发事件 168 barCode.IsValid = false; 169 170 171 return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); 172 173 174 / 安装钩子 175 public bool Start() 176 177 if (hKeyboardHook = 0) 178 179 /WH_KEYBOARD_LL = 13 180 hKeyboardHook = SetWindowsHookEx(13, new HookProc(KeyboardHookProc), Marshal.GetHINSTANCE(Assembly

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论