C#键盘钩子问题

问题描述

最近用网上写的C#键盘钩子获取USB扫描枪条码的一段代码遇到比较头疼的问题,扫描的条码值不对扫描条码“KK25F1840W/019203001156”,用此代码结果是“kkk255F18400w/019203001156”代码如下:(求高手解答)BarCodeHook类:usingSystem.Runtime.InteropServices;usingSystem.Reflection;namespaceWindowsApplication2{publicclassBarCodeHook{publicdelegatevoidBarCodeDelegate(BarCodesbarCode);publiceventBarCodeDelegateBarCodeEvent;publicstructBarCodes{publicintVirtKey;//虚拟码publicintScanCode;//扫描码publicstringKeyName;//键名publicuintAscII;//AscIIpubliccharChr;//字符publicstringBarCode;//条码信息publicboolIsValid;//条码是否有效publicDateTimeTime;//扫描时间}privatestructEventMsg{publicintmessage;publicintparamL;publicintparamH;publicintTime;publicinthwnd;}[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]privatestaticexternintSetWindowsHookEx(intidHook,HookProclpfn,IntPtrhInstance,intthreadId);[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]privatestaticexternboolUnhookWindowsHookEx(intidHook);[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]privatestaticexternintCallNextHookEx(intidHook,intnCode,Int32wParam,IntPtrlParam);[DllImport("user32",EntryPoint="GetKeyNameText")]privatestaticexternintGetKeyNameText(intlParam,StringBuilderlpBuffer,intnSize);[DllImport("user32",EntryPoint="GetKeyboardState")]privatestaticexternintGetKeyboardState(byte[]pbKeyState);[DllImport("user32",EntryPoint="ToAscii")]privatestaticexternboolToAscii(intVirtualKey,intScanCode,byte[]lpKeyState,refuintlpChar,intuFlags);delegateintHookProc(intnCode,Int32wParam,IntPtrlParam);BarCodesbarCode=newBarCodes();inthKeyboardHook=0;stringstrBarCode="";privateintKeyboardHookProc(intnCode,Int32wParam,IntPtrlParam){if(nCode==0){EventMsgmsg=(EventMsg)Marshal.PtrToStructure(lParam,typeof(EventMsg));if(wParam==0x100)//WM_KEYDOWN=0x100{barCode.VirtKey=msg.message&0xff;//虚拟码barCode.ScanCode=msg.paramL&0xff;//扫描码StringBuilderstrKeyName=newStringBuilder(255);if(GetKeyNameText(barCode.ScanCode*65536,strKeyName,255)>0){barCode.KeyName=strKeyName.ToString().Trim(newchar[]{'',''});}else{barCode.KeyName="";}byte[]kbArray=newbyte[256];uintuKey=0;GetKeyboardState(kbArray);if(ToAscii(barCode.VirtKey,barCode.ScanCode,kbArray,refuKey,0)){barCode.AscII=uKey;barCode.Chr=Convert.ToChar(uKey);}if(DateTime.Now.Subtract(barCode.Time).TotalMilliseconds>50){strBarCode=barCode.Chr.ToString();}else{if((msg.message&0xff)==13&&strBarCode.Length>3)//回车{barCode.BarCode=strBarCode;barCode.IsValid=true;strBarCode="";}strBarCode+=barCode.Chr.ToString();}barCode.Time=DateTime.Now;if(BarCodeEvent!=null)BarCodeEvent(barCode);//触发事件barCode.IsValid=false;}}returnCallNextHookEx(hKeyboardHook,nCode,wParam,lParam);}//安装钩子publicboolStart(){if(hKeyboardHook==0){//WH_KEYBOARD_LL=13hKeyboardHook=SetWindowsHookEx(13,newHookProc(KeyboardHookProc),Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);}return(hKeyboardHook!=0);}//卸载钩子publicboolStop(){if(hKeyboardHook!=0){returnUnhookWindowsHookEx(hKeyboardHook);}returntrue;}}}页面代码:BarCodeHookBarCode=newBarCodeHook();publicForm2(){InitializeComponent();BarCode.BarCodeEvent+=newBarCodeHook.BarCodeDelegate(BarCode_BarCodeEvent);}privatedelegatevoidShowInfoDelegate(BarCodeHook.BarCodesbarCode);privatevoidShowInfo(BarCodeHook.BarCodesbarCode){if(this.InvokeRequired){this.BeginInvoke(newShowInfoDelegate(ShowInfo),newobject[]{barCode});}else{textBox1.Text=barCode.KeyName;textBox2.Text=barCode.VirtKey.ToString();textBox3.Text=barCode.ScanCode.ToString();textBox4.Text=barCode.AscII.ToString();textBox5.Text=barCode.Chr.ToString();//textBox6.Text=barCode.IsValid?barCode.BarCode:"";textBox6.Text=barCode.BarCode;}}voidBarCode_BarCodeEvent(BarCodeHook.BarCodesbarCode){ShowInfo(barCode);}privatevoidForm2_Load(objectsender,EventArgse){BarCode.Start();}privatevoidForm2_FormClosed(objectsender,FormClosedEventArgse){BarCode.Stop();}

解决方案

解决方案二:
条码值KK25F1840W/019203001156是哪几个参数?
解决方案三:
ToUpper方法
解决方案四:
如果只是大小写问题可以strings="kkk255F18400w/019203001156".ToUpper();
解决方案五:
楼主说多个K?
解决方案六:
是的,有时出现讲1解析成!,将2解析成@……
解决方案七:
找到问题原因了谢谢各位@
解决方案八:
楼主,怎么解决的啊?能否分享一下呢?
解决方案:
如果可以QQ联系2535052261
解决方案:
我给你的建议是,你扫条码,首先条码都是有规则的,比如前几位是什么,日期码是哪几位,校验规则是什么。这样你在扫条码的时候,比如你这种条码开头是KK的话,你钩子接受到KK,就加到list<char>然后继续接收,不是那就清空。然后条码是多少位,最后一定有个算法校验的。判断出你接收的是正确的条码你再做后续操作。当年做条码扫描也是吃了不少苦头啊。。。

时间: 2024-11-05 14:54:16

C#键盘钩子问题的相关文章

利用底层键盘钩子拦载任意按键(回调版)

前段时间我曾经写过一篇<利用底层键盘钩子屏蔽任意按键>,并放到了我的blog上.这 篇文章的题目中把"屏蔽"改成了"拦截",显然要比以前的版本强 一些了.对于以前写的那个DLL,有一个不够理想的地方,就是仅仅能实现屏蔽.如果想在屏 蔽之前加入一些"小动作",就只能修改DLL,在LowLevelKeyboardProc函数中添 加代码,实现新的功能.但这样显然不够灵活,这样的DLL也不具备一般性了.所以我自然而 然地想到了回调,Wind

利用键盘钩子开发按键发音程序

本文配套源码 一.前言 一日,看见我妈正在用电脑练习打字,频频低头看键盘,我想:要是键盘能发音的话,不就可以方便她养成"盲打"的好习惯吗?光想不做可不行,开始行动(您可千万别急着去 拿工具箱啊^_^)... 按键能发音,其关键就是让程序能够知道当前键盘上是哪个键被按下,并播 放相应的声音,自己的程序当然不在话下,那么其它程序当前按下哪个键如何得知呢?利用键盘钩子便可 以很好地解决. 下载本文的全部源代码 大小:552K 二.挂钩(HOOK)的基本原理 WINDOWS调用挂接的回调函数时

java web 程序 可不可以在客户端运行键盘钩子 要 怎么做?

问题描述 java web 程序 可不可以在客户端运行键盘钩子 要 怎么做? 50C java web 程序 可不可以在客户端运行键盘钩子 要 怎么做? 解决方案 可以试一下ActiveX控件+DLL的方式 解决方案二: web程序本身进程来加载键盘hook DLL 解决方案三: 亲们 帮帮忙 最后一哆嗦了 解决方案四: 这个是个现成的程序你参考一下:http://download.csdn.net/detail/qwe852012/1720478 解决方案五: 在服务端是可以 我要的是在客户端

win32汇编-WIN32汇编键盘钩子截获全部键盘

问题描述 WIN32汇编键盘钩子截获全部键盘 普通的键盘钩子只能截获普通的键盘操作,但是不能截获到shift等系统键,求问怎么样截获所有的键盘操作 解决方案 http://www.cnblogs.com/zudn/archive/2010/12/15/1906374.html 解决方案二: win32程序测试键盘钩子win32程序测试键盘钩子

vc++6 0-全局键盘钩子函数的回调函数有时无效

问题描述 全局键盘钩子函数的回调函数有时无效 DLL代码: myHooke.c #include "myHooke.h" #include <windows.h> #include <winuser.h> #include <stdlib.h> #include <stdio.h> int ndown = 0; HHOOK hhkHook = NULL; //定义钩子句柄 HINSTANCE hInstance = NULL; //程序实

vb.net 全局键盘钩子?

问题描述 这段键盘钩子,在窗口里怎么调用啊?ImportsSystem.Reflection,System.Threading,System.ComponentModel,System.Runtime.InteropServices'''<summary>本类可以在.NET环境下使用系统键盘与鼠标钩子</summary>PublicClassSystemHook定义结构API声明导入常量声明事件委托处理PrivatehMouseHookAsIntegerPrivatehKeyboa

在键盘钩子中对lParam进行Marshal.PtrToStructure类型转换时发生“内存保护”错误。

问题描述 键盘信息类:[StructLayout(LayoutKind.Sequential)]publicstructKeyBoardHookStruct{publicintvkCode;publicintscanCode;publicintflags;publicinttime;publicintdwExtraInfo;}在键盘钩子函数privateintKeyboardHookProc(intnCode,Int32wParam,IntPtrlParam)中进行KeyBoardHookStr

按键-java 键盘钩子 进程 客户端 进程加载HOOK DLL

问题描述 java 键盘钩子 进程 客户端 进程加载HOOK DLL java web程序在客户端获取键盘按键 这个要怎么写?要有实例 没写过这样的程序 不知道从哪里下手 解决方案 需要本地做插件(用Activex或者JavaBean),直接用web程序实现不了 解决方案二: 监听程序可参考 http://mzhx-com.iteye.com/blog/733704 解决方案三: 插件是用什么做的 ?

C# 全局键盘钩子 与sendkey

问题描述 C#全局键盘钩子的问题,本人刚接触,很多问题不太清楚,最好指出怎么修改谢谢.程序功能:按ctrl组合键输出一个值,按F9时也输出一个值但是F9的时候Sendkeys.send(变量)可以正常输出,而ctrl组合键输出不正常(启动程序第一次按ctrl组合键输出正常,之后就不行了),这里的变量是数组的其中一个元素键盘钩子代码可以参考http://jingyan.baidu.com/article/ceb9fb10ebd9f68cad2ba03c.html或http://pan.baidu.

键盘钩子lParam问题

问题描述 if(lParam&0x80000000)判断让键盘只处理一次事件,网上资料好像可行,为什么我提示错误运算符"&"无法应用于"System.IntPtr"和"uint"类型的操作数. 解决方案 解决方案二:if((lParam.ToInt64()&0x80000000)==0x80000000)解决方案三://钩子事件内部调用,调用_clientMethod方法转发到客户端应用.privatestaticintO