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#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。