Csharp/C#教程:C#实现可捕获几乎所有键盘鼠标事件的钩子类完整实例分享

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

usingSystem; usingSystem.Text; usingSystem.Runtime.InteropServices; usingSystem.Reflection; usingSystem.Windows.Forms; namespaceMouseKeyboardLibrary { ///<summary> ///AbstractbaseclassforMouseandKeyboardhooks ///</summary> 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 #regionPrivateVariables protectedint_hookType; protectedint_handleToHook; protectedbool_isStarted; protectedHookProc_hookCallback; #endregion #regionProperties publicboolIsStarted { get { return_isStarted; } } #endregion #regionConstructor publicGlobalHook() { Application.ApplicationExit+=newEventHandler(Application_ApplicationExit); } #endregion #regionMethods publicvoidStart() { 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) { //Thismethodmustbeoverridenbyeachextendinghook return0; } protectedvoidApplication_ApplicationExit(objectsender,EventArgse) { if(_isStarted) { Stop(); } } #endregion } } usingSystem; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Runtime.InteropServices; namespaceMouseKeyboardLibrary { ///<summary> ///Capturesglobalkeyboardevents ///</summary> publicclassKeyboardHook:GlobalHook { #regionEvents publiceventKeyEventHandlerKeyDown; publiceventKeyEventHandlerKeyUp; publiceventKeyPressEventHandlerKeyPress; #endregion #regionConstructor publicKeyboardHook() { _hookType=WH_KEYBOARD_LL; } #endregion #regionMethods protectedoverrideintHookCallbackProcedure(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/altvaluesfoundabove KeyEventArgse=newKeyEventArgs( (Keys)( keyboardHookStruct.vkCode| (control?(int)Keys.Control:0)| (shift?(int)Keys.Shift:0)| (alt?(int)Keys.Alt:0) )); //HandleKeyDownandKeyUpevents switch(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; } //HandleKeyPressevent if(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 { ///<summary> ///StandardKeyboardShortcutsusedbymostapplications ///</summary> publicenumStandardShortcut { Copy, Cut, Paste, SelectAll, Save, Open, New, Close, Print } ///<summary> ///Simulatekeyboardkeypresses ///</summary> publicstaticclassKeyboardSimulator { #regionWindowsAPICode constintKEYEVENTF_EXTENDEDKEY=0x1; constintKEYEVENTF_KEYUP=0x2; [DllImport("user32.dll")] staticexternvoidkeybd_event(bytekey,bytescan,intflags,intextraInfo); #endregion #regionMethods publicstaticvoidKeyDown(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,andControlneedtobechangedforAPIfunctiontoworkwiththem switch(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 { ///<summary> ///Capturesglobalmouseevents ///</summary> publicclassMouseHook:GlobalHook { #regionMouseEventTypeEnum privateenumMouseEventType { None, MouseDown, MouseUp, DoubleClick, MouseWheel, MouseMove } #endregion #regionEvents publiceventMouseEventHandlerMouseDown; publiceventMouseEventHandlerMouseUp; publiceventMouseEventHandlerMouseMove; publiceventMouseEventHandlerMouseWheel; publiceventEventHandlerClick; publiceventEventHandlerDoubleClick; #endregion #regionConstructor publicMouseHook() { _hookType=WH_MOUSE_LL; } #endregion #regionMethods protectedoverrideintHookCallbackProcedure(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 { ///<summary> ///AndX,Ypointonthescreen ///</summary> publicstructMousePoint { publicMousePoint(Pointp) { X=p.X; Y=p.Y; } publicintX; publicintY; publicstaticimplicitoperatorPoint(MousePointp) { returnnewPoint(p.X,p.Y); } } ///<summary> ///Mousebuttonsthatcanbepressed ///</summary> publicenumMouseButton { Left=0x2, Right=0x8, Middle=0x20 } ///<summary> ///Operationsthatsimulatemouseevents ///</summary> publicstaticclassMouseSimulator { #regionWindowsAPICode [DllImport("user32.dll")] staticexternintShowCursor(boolshow); [DllImport("user32.dll")] staticexternvoidmouse_event(intflags,intdX,intdY,intbuttons,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 ///<summary> ///GetsorsetsastructurethatrepresentsbothXandYmousecoordinates ///</summary> publicstaticMousePointPosition { get { returnnewMousePoint(Cursor.Position); } set { Cursor.Position=value; } } ///<summary> ///Getsorsetsonlythemouse'sxcoordinate ///</summary> publicstaticintX { get { returnCursor.Position.X; } set { Cursor.Position=newPoint(value,Y); } } ///<summary> ///Getsorsetsonlythemouse'sycoordinate ///</summary> publicstaticintY { get { returnCursor.Position.Y; } set { Cursor.Position=newPoint(X,value); } } #endregion #regionMethods ///<summary> ///Pressamousebuttondown ///</summary> ///<paramname="button"></param> 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; } } ///<summary> ///Letamousebuttonup ///</summary> ///<paramname="button"></param> 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; } } ///<summary> ///Clickamousebutton(downthenup) ///</summary> ///<paramname="button"></param> 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; } } ///<summary> ///Doubleclickamousebutton(downthenuptwice) ///</summary> ///<paramname="button"></param> 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; } } ///<summary> ///Showahiddencurrentoncurrentlyapplication ///</summary> publicstaticvoidShow() { ShowCursor(true); } ///<summary> ///Hidemousecursoronlyoncurrentapplication'sforms ///</summary> 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(); } } }

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《WinForm控件用法上述就是C#学习教程:C#实现可捕获几乎所有键盘鼠标事件的钩子类完整实例分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/907376.html

(0)
上一篇 2021年10月24日
下一篇 2021年10月24日

精彩推荐