配色: 字号:
C#实现可捕获几乎所有键盘鼠标事件的钩子类完整实例
2016-12-27 | 阅:  转:  |  分享 
  
C#实现可捕获几乎所有键盘鼠标事件的钩子类完整实例



这篇文章主要介绍了C#实现可捕获几乎所有键盘鼠标事件的钩子类,以完整实例形式分析了C#捕获键盘鼠标事件的钩子操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下



本文实例讲述了C#实现可捕获几乎所有键盘鼠标事件的钩子类。分享给大家供大家参考,具体如下:



usingSystem;usingSystem.Text;usingSystem.Runtime.InteropServices;usingSystem.Reflection;usingSystem.Windows.Forms;namespaceMouseKeyboardLibrary{//////AbstractbaseclassforMouseandKeyboardhooks///publicabstractclassGlobalHook{#regionWindowsAPICode[StructLayout(LayoutKind.Sequential)]protectedclassPOINT{publicintx;publicinty;}[StructLayout(LayoutKind.Sequential)]protectedclassMouseHookStruct{publicPOINTpt;publicinthwnd;publicintwHitTestCode;publicintdwExtraInfo;}[StructLayout(LayoutKind.Sequential)]protectedclassMouseLLHookStruct{publicPOINTpt;publicintmouseData;publicintflags;publicinttime;publicintdwExtraInfo;}[StructLayout(LayoutKind.Sequential)]protectedclassKeyboardHookStruct{publicintvkCode;publicintscanCode;publicintflags;publicinttime;publicintdwExtraInfo;}[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall,SetLastError=true)]protectedstaticexternintSetWindowsHookEx(intidHook,HookProclpfn,IntPtrhMod,intdwThreadId);[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall,SetLastError=true)]protectedstaticexternintUnhookWindowsHookEx(intidHook);[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]protectedstaticexternintCallNextHookEx(intidHook,intnCode,intwParam,IntPtrlParam);[DllImport("user32")]protectedstaticexternintToAscii(intuVirtKey,intuScanCode,byte[]lpbKeyState,byte[]lpwTransKey,intfuState);[DllImport("user32")]protectedstaticexternintGetKeyboardState(byte[]pbKeyState);[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]protectedstaticexternshortGetKeyState(intvKey);protecteddelegateintHookProc(intnCode,intwParam,IntPtrlParam);protectedconstintWH_MOUSE_LL=14;protectedconstintWH_KEYBOARD_LL=13;protectedconstintWH_MOUSE=7;protectedconstintWH_KEYBOARD=2;protectedconstintWM_MOUSEMOVE=0x200;protectedconstintWM_LBUTTONDOWN=0x201;protectedconstintWM_RBUTTONDOWN=0x204;protectedconstintWM_MBUTTONDOWN=0x207;protectedconstintWM_LBUTTONUP=0x202;protectedconstintWM_RBUTTONUP=0x205;protectedconstintWM_MBUTTONUP=0x208;protectedconstintWM_LBUTTONDBLCLK=0x203;protectedconstintWM_RBUTTONDBLCLK=0x206;protectedconstintWM_MBUTTONDBLCLK=0x209;protectedconstintWM_MOUSEWHEEL=0x020A;protectedconstintWM_KEYDOWN=0x100;protectedconstintWM_KEYUP=0x101;protectedconstintWM_SYSKEYDOWN=0x104;protectedconstintWM_SYSKEYUP=0x105;protectedconstbyteVK_SHIFT=0x10;protectedconstbyteVK_CAPITAL=0x14;protectedconstbyteVK_NUMLOCK=0x90;protectedconstbyteVK_LSHIFT=0xA0;protectedconstbyteVK_RSHIFT=0xA1;protectedconstbyteVK_LCONTROL=0xA2;protectedconstbyteVK_RCONTROL=0x3;protectedconstbyteVK_LALT=0xA4;protectedconstbyteVK_RALT=0xA5;protectedconstbyteLLKHF_ALTDOWN=0x20;#endregion#regionPrivateVariablesprotectedint_hookType;protectedint_handleToHook;protectedbool_isStarted;protectedHookProc_hookCallback;#endregion#regionPropertiespublicboolIsStarted{get{return_isStarted;}}#endregion#regionConstructorpublicGlobalHook(){Application.ApplicationExit+=newEventHandler(Application_ApplicationExit);}#endregion#regionMethodspublicvoidStart(){if(!_isStarted&&_hookType!=0){//Makesurewekeepareferencetothisdelegate!//Ifnot,GCrandomlycollectsit,andaNullReferenceexceptionisthrown_hookCallback=newHookProc(HookCallbackProcedure);_handleToHook=SetWindowsHookEx(_hookType,_hookCallback,//Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);IntPtr.Zero;//Wereweabletosucessfullystarthook?if(_handleToHook!=0){_isStarted=true;}}}publicvoidStop(){if(_isStarted){UnhookWindowsHookEx(_handleToHook);_isStarted=false;}}protectedvirtualintHookCallbackProcedure(intnCode,Int32wParam,IntPtrlParam){//Thismethodmustbeoverridenbyeachextendinghookreturn0;}protectedvoidApplication_ApplicationExit(objectsender,EventArgse){if(_isStarted){Stop();}}#endregion}}



usingSystem;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;namespaceMouseKeyboardLibrary{//////Capturesglobalkeyboardevents///publicclassKeyboardHook:GlobalHook{#regionEventspubliceventKeyEventHandlerKeyDown;publiceventKeyEventHandlerKeyUp;publiceventKeyPressEventHandlerKeyPress;#endregion#regionConstructorpublicKeyboardHook(){_hookType=WH_KEYBOARD_LL;}#endregion#regionMethodsprotectedoverrideintHookCallbackProcedure(intnCode,intwParam,IntPtrlParam){boolhandled=false;if(nCode>-1&&(KeyDown!=null||KeyUp!=null||KeyPress!=null)){KeyboardHookStructkeyboardHookStruct=(KeyboardHookStruct)Marshal.PtrToStructure(lParam,typeof(KeyboardHookStruct));//IsControlbeinghelddown?boolcontrol=((GetKeyState(VK_LCONTROL)&0x80)!=0)||((GetKeyState(VK_RCONTROL)&0x80)!=0);//IsShiftbeinghelddown?boolshift=((GetKeyState(VK_LSHIFT)&0x80)!=0)||((GetKeyState(VK_RSHIFT)&0x80)!=0);//IsAltbeinghelddown?boolalt=((GetKeyState(VK_LALT)&0x80)!=0)||((GetKeyState(VK_RALT)&0x80)!=0);//IsCapsLockon?boolcapslock=(GetKeyState(VK_CAPITAL)!=0);//Createeventusingkeycodeandcontrol/shift/altvaluesfoundaboveKeyEventArgse=newKeyEventArgs((Keys)(keyboardHookStruct.vkCode|(control?(int)Keys.Control:0)|(shift?(int)Keys.Shift:0)|(alt?(int)Keys.Alt:0)));//HandleKeyDownandKeyUpeventsswitch(wParam){caseWM_KEYDOWN:caseWM_SYSKEYDOWN:if(KeyDown!=null){KeyDown(this,e);handled=handled||e.Handled;}break;caseWM_KEYUP:caseWM_SYSKEYUP:if(KeyUp!=null){KeyUp(this,e);handled=handled||e.Handled;}break;}//HandleKeyPresseventif(wParam==WM_KEYDOWN&&!handled&&!e.SuppressKeyPress&&KeyPress!=null){byte[]keyState=newbyte[256];byte[]inBuffer=newbyte[2];GetKeyboardState(keyState);if(ToAscii(keyboardHookStruct.vkCode,keyboardHookStruct.scanCode,keyState,inBuffer,keyboardHookStruct.flags)==1){charkey=(char)inBuffer[0];if((capslock^shift)&&Char.IsLetter(key))key=Char.ToUpper(key);KeyPressEventArgse2=newKeyPressEventArgs(key);KeyPress(this,e2);handled=handled||e.Handled;}}}if(handled){return1;}else{returnCallNextHookEx(_handleToHook,nCode,wParam,lParam);}}#endregion}}



usingSystem;usingSystem.Text;usingSystem.Runtime.InteropServices;usingSystem.Windows.Forms;namespaceMouseKeyboardLibrary{//////StandardKeyboardShortcutsusedbymostapplications///publicenumStandardShortcut{Copy,Cut,Paste,SelectAll,Save,Open,New,Close,Print}//////Simulatekeyboardkeypresses///publicstaticclassKeyboardSimulator{#regionWindowsAPICodeconstintKEYEVENTF_EXTENDEDKEY=0x1;constintKEYEVENTF_KEYUP=0x2;[DllImport("user32.dll")]staticexternvoidkeybd_event(bytekey,bytescan,intflags,intextraInfo);#endregion#regionMethodspublicstaticvoidKeyDown(Keyskey){keybd_event(ParseKey(key),0,0,0);}publicstaticvoidKeyUp(Keyskey){keybd_event(ParseKey(key),0,KEYEVENTF_KEYUP,0);}publicstaticvoidKeyPress(Keyskey){KeyDown(key);KeyUp(key);}publicstaticvoidSimulateStandardShortcut(StandardShortcutshortcut){switch(shortcut){caseStandardShortcut.Copy:KeyDown(Keys.Control);KeyPress(Keys.C);KeyUp(Keys.Control);break;caseStandardShortcut.Cut:KeyDown(Keys.Control);KeyPress(Keys.X);KeyUp(Keys.Control);break;caseStandardShortcut.Paste:KeyDown(Keys.Control);KeyPress(Keys.V);KeyUp(Keys.Control);break;caseStandardShortcut.SelectAll:KeyDown(Keys.Control);KeyPress(Keys.A);KeyUp(Keys.Control);break;caseStandardShortcut.Save:KeyDown(Keys.Control);KeyPress(Keys.S);KeyUp(Keys.Control);break;caseStandardShortcut.Open:KeyDown(Keys.Control);KeyPress(Keys.O);KeyUp(Keys.Control);break;caseStandardShortcut.New:KeyDown(Keys.Control);KeyPress(Keys.N);KeyUp(Keys.Control);break;caseStandardShortcut.Close:KeyDown(Keys.Alt);KeyPress(Keys.F4);KeyUp(Keys.Alt);break;caseStandardShortcut.Print:KeyDown(Keys.Control);KeyPress(Keys.P);KeyUp(Keys.Control);break;}}staticbyteParseKey(Keyskey){//Alt,Shift,andControlneedtobechangedforAPIfunctiontoworkwiththemswitch(key){caseKeys.Alt:return(byte)18;caseKeys.Control:return(byte)17;caseKeys.Shift:return(byte)16;default:return(byte)key;}}#endregion}}



usingSystem;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;namespaceMouseKeyboardLibrary{//////Capturesglobalmouseevents///publicclassMouseHook:GlobalHook{#regionMouseEventTypeEnumprivateenumMouseEventType{None,MouseDown,MouseUp,DoubleClick,MouseWheel,MouseMove}#endregion#regionEventspubliceventMouseEventHandlerMouseDown;publiceventMouseEventHandlerMouseUp;publiceventMouseEventHandlerMouseMove;publiceventMouseEventHandlerMouseWheel;publiceventEventHandlerClick;publiceventEventHandlerDoubleClick;#endregion#regionConstructorpublicMouseHook(){_hookType=WH_MOUSE_LL;}#endregion#regionMethodsprotectedoverrideintHookCallbackProcedure(intnCode,intwParam,IntPtrlParam){if(nCode>-1&&(MouseDown!=null||MouseUp!=null||MouseMove!=null)){MouseLLHookStructmouseHookStruct=(MouseLLHookStruct)Marshal.PtrToStructure(lParam,typeof(MouseLLHookStruct));MouseButtonsbutton=GetButton(wParam);MouseEventTypeeventType=GetEventType(wParam);MouseEventArgse=newMouseEventArgs(button,(eventType==MouseEventType.DoubleClick?2:1),mouseHookStruct.pt.x,mouseHookStruct.pt.y,(eventType==MouseEventType.MouseWheel?(short)((mouseHookStruct.mouseData>>16)&0xffff):0));//PreventmultipleRightClickevents(thisprobablyhappensforpopupmenus)if(button==MouseButtons.Right&&mouseHookStruct.flags!=0){eventType=MouseEventType.None;}switch(eventType){caseMouseEventType.MouseDown:if(MouseDown!=null){MouseDown(this,e);}break;caseMouseEventType.MouseUp:if(Click!=null){Click(this,newEventArgs());}if(MouseUp!=null){MouseUp(this,e);}break;caseMouseEventType.DoubleClick:if(DoubleClick!=null){DoubleClick(this,newEventArgs());}break;caseMouseEventType.MouseWheel:if(MouseWheel!=null){MouseWheel(this,e);}break;caseMouseEventType.MouseMove:if(MouseMove!=null){MouseMove(this,e);}break;default:break;}}returnCallNextHookEx(_handleToHook,nCode,wParam,lParam);}privateMouseButtonsGetButton(Int32wParam){switch(wParam){caseWM_LBUTTONDOWN:caseWM_LBUTTONUP:caseWM_LBUTTONDBLCLK:returnMouseButtons.Left;caseWM_RBUTTONDOWN:caseWM_RBUTTONUP:caseWM_RBUTTONDBLCLK:returnMouseButtons.Right;caseWM_MBUTTONDOWN:caseWM_MBUTTONUP:caseWM_MBUTTONDBLCLK:returnMouseButtons.Middle;default:returnMouseButtons.None;}}privateMouseEventTypeGetEventType(Int32wParam){switch(wParam){caseWM_LBUTTONDOWN:caseWM_RBUTTONDOWN:caseWM_MBUTTONDOWN:returnMouseEventType.MouseDown;caseWM_LBUTTONUP:caseWM_RBUTTONUP:caseWM_MBUTTONUP:returnMouseEventType.MouseUp;caseWM_LBUTTONDBLCLK:caseWM_RBUTTONDBLCLK:caseWM_MBUTTONDBLCLK:returnMouseEventType.DoubleClick;caseWM_MOUSEWHEEL:returnMouseEventType.MouseWheel;caseWM_MOUSEMOVE:returnMouseEventType.MouseMove;default:returnMouseEventType.None;}}#endregion}}



usingSystem;usingSystem.Text;usingSystem.Runtime.InteropServices;usingSystem.Drawing;usingSystem.Windows.Forms;namespaceMouseKeyboardLibrary{//////AndX,Ypointonthescreen///publicstructMousePoint{publicMousePoint(Pointp){X=p.X;Y=p.Y;}publicintX;publicintY;publicstaticimplicitoperatorPoint(MousePointp){returnnewPoint(p.X,p.Y);}}//////Mousebuttonsthatcanbepressed///publicenumMouseButton{Left=0x2,Right=0x8,Middle=0x20}//////Operationsthatsimulatemouseevents///publicstaticclassMouseSimulator{#regionWindowsAPICode[DllImport("user32.dll")]staticexternintShowCursor(boolshow);[DllImport("user32.dll")]staticexternvoidmouse_event(intflags,intdX,intdY,intwww.hunanwang.netbuttons,intextraInfo);constintMOUSEEVENTF_MOVE=0x1;constintMOUSEEVENTF_LEFTDOWN=0x2;constintMOUSEEVENTF_LEFTUP=0x4;constintMOUSEEVENTF_RIGHTDOWN=0x8;constintMOUSEEVENTF_RIGHTUP=0x10;constintMOUSEEVENTF_MIDDLEDOWN=0x20;constintMOUSEEVENTF_MIDDLEUP=0x40;constintMOUSEEVENTF_WHEEL=0x800;constintMOUSEEVENTF_ABSOLUTE=0x8000;#endregion#regionProperties//////GetsorsetsastructurethatrepresentsbothXandYmousecoordinates///publicstaticMousePointPosition{get{returnnewMousePoint(Cursor.Position);}set{Cursor.Position=value;}}//////Getsorsetsonlythemouse''sxcoordinate///publicstaticintX{get{returnCursor.Position.X;}set{Cursor.Position=newPoint(value,Y);}}//////Getsorsetsonlythemouse''sycoordinate///publicstaticintY{get{returnCursor.Position.Y;}set{Cursor.Position=newPoint(X,value);}}#endregion#regionMethods//////Pressamousebuttondown//////publicstaticvoidMouseDown(MouseButtonbutton){mouse_event(((int)button),0,0,0,0);}publicstaticvoidMouseDown(MouseButtonsbutton){switch(button){caseMouseButtons.Left:MouseDown(MouseButton.Left);break;caseMouseButtons.Middle:MouseDown(MouseButton.Middle);break;caseMouseButtons.Right:MouseDown(MouseButton.Right);break;}}//////Letamousebuttonup//////publicstaticvoidMouseUp(MouseButtonbutton){mouse_event(((int)button)2,0,0,0,0);}publicstaticvoidMouseUp(MouseButtonsbutton){switch(button){caseMouseButtons.Left:MouseUp(MouseButton.Left);break;caseMouseButtons.Middle:MouseUp(MouseButton.Middle);break;caseMouseButtons.Right:MouseUp(MouseButton.Right);break;}}//////Clickamousebutton(downthenup)//////publicstaticvoidClick(MouseButtonbutton){MouseDown(button);MouseUp(button);}publicstaticvoidClick(MouseButtonsbutton){switch(button){caseMouseButtons.Left:Click(MouseButton.Left);break;caseMouseButtons.Middle:Click(MouseButton.Middle);break;caseMouseButtons.Right:Click(MouseButton.Right);break;}}//////Doubleclickamousebutton(downthenuptwice)//////publicstaticvoidDoubleClick(MouseButtonbutton){Click(button);Click(button);}publicstaticvoidDoubleClick(MouseButtonsbutton){switch(button){caseMouseButtons.Left:DoubleClick(MouseButton.Left);break;caseMouseButtons.Middle:DoubleClick(MouseButton.Middle);break;caseMouseButtons.Right:DoubleClick(MouseButton.Right);break;}}//////Showahiddencurrentoncurrentlyapplication///publicstaticvoidShow(){ShowCursor(true);}//////Hidemousecursoronlyoncurrentappliwww.visa158.comtion''sforms///publicstaticvoidHide(){ShowCursor(false);}#endregion}}



usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingMouseKeyboardLibrary;namespaceSampleApplication{/上面的5个类编译成Dll引用,使用例子/publicpartialclassHookTestForm:Form{MouseHookmouseHook=newMouseHook();KeyboardHookkeyboardHook=newKeyboardHook();publicHookTestForm(){InitializeComponent();}privatevoidTestForm_Load(objectsender,EventArgse){mouseHook.MouseMove+=newMouseEventHandler(mouseHook_MouseMove);mouseHook.MouseDown+=newMouseEventHandler(mouseHook_MouseDown);mouseHook.MouseUp+=newMouseEventHandler(mouseHook_MouseUp);mouseHook.MouseWheel+=newMouseEventHandler(mouseHook_MouseWheel);keyboardHook.KeyDown+=newKeyEventHandler(keyboardHook_KeyDown);keyboardHook.KeyUp+=newKeyEventHandler(keyboardHook_KeyUp);keyboardHook.KeyPress+=newKeyPressEventHandler(keyboardHook_KeyPress);mouseHook.Start();keyboardHook.Start();SetXYLabel(MouseSimulator.X,MouseSimulator.Y);}voidkeyboardHook_KeyPress(objectsender,KeyPressEventArgse){AddKeyboardEvent("KeyPress","",e.KeyChar.ToString(),"","","");}voidkeyboardHook_KeyUp(objectsender,KeyEventArgse){AddKeyboardEvent("KeyUp",e.KeyCode.ToString(),"",e.Shift.ToString(),e.Alt.ToString(),e.Control.ToString());}voidkeyboardHook_KeyDown(objectsender,KeyEventArgse){AddKeyboardEvent("KeyDown",e.KeyCode.ToString(),"",e.Shift.ToString(),e.Alt.ToString(),e.Control.ToString());}voidmouseHook_MouseWheel(objectsender,MouseEventArgse){AddMouseEvent("MouseWheel","","","",e.Delta.ToString());}voidmouseHook_MouseUp(objectsender,MouseEventArgse){AddMouseEvent("MouseUp",e.Button.ToString(),e.X.ToString(),e.Y.ToString(),"");}voidmouseHook_MouseDown(objectsender,MouseEventArgse){AddMouseEvent("MouseDown",e.Button.ToString(),e.X.ToString(),e.Y.ToString(),"");}voidmouseHook_MouseMove(objectsender,MouseEventArgse){SetXYLabel(e.X,e.Y);}voidSetXYLabel(intx,inty){curXYLabel.Text=String.Format("CurrentMousePoint:X={0},y={1}",x,y);}voidAddMouseEvent(stringeventType,stringbutton,stringx,stringy,stringdelta){listView1.Items.Insert(0,newListViewItem(newstring[]{eventType,button,x,y,delta}));}voidAddKeyboardEvent(stringeventType,stringkeyCode,stringkeyChar,stringshift,stringalt,stringcontrol){listView2.Items.Insert(0,newListViewItem(newstring[]{eventType,keyCode,keyChar,shift,alt,control}));}privatevoidTestForm_FormClosed(objectsender,FormClosedEventArgse){//Notnecessaryanymore,willstopwhenapplicationexits//mouseHook.Stop();//keyboardHook.Stop();}}}





















献花(0)
+1
(本文系白狐一梦首藏)