鼠标和键盘操作的全局钩子较好.docx
- 文档编号:23349116
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:21
- 大小:18.13KB
鼠标和键盘操作的全局钩子较好.docx
《鼠标和键盘操作的全局钩子较好.docx》由会员分享,可在线阅读,更多相关《鼠标和键盘操作的全局钩子较好.docx(21页珍藏版)》请在冰豆网上搜索。
鼠标和键盘操作的全局钩子较好
usingSystem;
usingSystem.ComponentModel;
usingSystem.Reflection;
usingSystem.Runtime.InteropServices;
usingSystem.Windows.Forms;
namespaceUserActivityMonitor
{
///
///Thisclassmonitorsallmouseactivitiesglobally(alsooutsideoftheapplication)
///andprovidesappropriateevents.
///
publicstaticclassHookManager
{
///
///Occurswhenthemousepointerismoved.
///
publicstaticeventMouseEventHandlerMouseMove
{
add
{
EnsureSubscribedToGlobalMouseEvents();
s_MouseMove+=value;
}
remove
{
s_MouseMove-=value;
TryUnsubscribeFromGlobalMouseEvents();
}
}
///
///Occurswhenaclickwasperformedbythemouse.
///
publicstaticeventMouseEventHandlerMouseClick
{
add
{
EnsureSubscribedToGlobalMouseEvents();
s_MouseClick+=value;
}
remove
{
s_MouseClick-=value;
TryUnsubscribeFromGlobalMouseEvents();
}
}
///
///Occurswhenthemouseamousebuttonispressed.
///
publicstaticeventMouseEventHandlerMouseDown
{
add
{
EnsureSubscribedToGlobalMouseEvents();
s_MouseDown+=value;
}
remove
{
s_MouseDown-=value;
TryUnsubscribeFromGlobalMouseEvents();
}
}
///
///Occurswhenamousebuttonisreleased.
///
publicstaticeventMouseEventHandlerMouseUp
{
add
{
EnsureSubscribedToGlobalMouseEvents();
s_MouseUp+=value;
}
remove
{
s_MouseUp-=value;
TryUnsubscribeFromGlobalMouseEvents();
}
}
///
///Occurswhenthemousewheelmoves.
///
publicstaticeventMouseEventHandlerMouseWheel
{
add
{
EnsureSubscribedToGlobalMouseEvents();
s_MouseWheel+=value;
}
remove
{
s_MouseWheel-=value;
TryUnsubscribeFromGlobalMouseEvents();
}
}
///
///Occurswhenadoubleclickedwasperformedbythemouse.
///
publicstaticeventMouseEventHandlerMouseDoubleClick
{
add
{
EnsureSubscribedToGlobalMouseEvents();
if(s_MouseDoubleClick==null)
{
s_DoubleClickTimer=newTimer
{
Interval=GetDoubleClickTime(),
Enabled=false};
s_DoubleClickTimer.Tick+=DoubleClickTimeElapsed;
MouseUp+=OnMouseUp;
}
s_MouseDoubleClick+=value;
}
remove
{
if(s_MouseDoubleClick!
=null)
{
s_MouseDoubleClick-=value;
if(s_MouseDoubleClick==null)
{
MouseUp-=OnMouseUp;
s_DoubleClickTimer.Tick-=DoubleClickTimeElapsed;
s_DoubleClickTimer=null;
}
}
TryUnsubscribeFromGlobalMouseEvents();
}
}
///
///Occurswhenakeyisreleased.
///
publicstaticeventKeyEventHandlerKeyUp
{
add
{
EnsureSubscribedToGlobalKeyboardEvents();
s_KeyUp+=value;
}
remove
{
s_KeyUp-=value;
TryUnsubscribeFromGlobalKeyboardEvents();
}
}
///
///Occurswhenakeyispreseed.
///
publicstaticeventKeyEventHandlerKeyDown
{
add
{
EnsureSubscribedToGlobalKeyboardEvents();
s_KeyDown+=value;
}
remove
{
s_KeyDown-=value;
TryUnsubscribeFromGlobalKeyboardEvents();
}
}
///
///Occurswhenakeyispressed.
///
///
///Keyeventsoccurinthefollowingorder:
///
///
///
///
///
///TheKeyPresseventisnotraisedbynoncharacterkeys;however,thenoncharacterkeysdoraisetheKeyDownandKeyUpevents.
///UsetheKeyCharpropertytosamplekeystrokesatruntimeandtoconsumeormodifyasubsetofcommonkeystrokes.
///Tohandlekeyboardeventsonlyinyourapplicationandnotenableotherapplicationstoreceivekeyboardevents,
///settheKeyPressEventArgs.Handledpropertyinyourform'sKeyPressevent-handlingmethodtotrue.
///
publicstaticeventKeyPressEventHandlerKeyPress
{
add
{
EnsureSubscribedToGlobalKeyboardEvents();
s_KeyPress+=value;
}
remove
{
s_KeyPress-=value;
TryUnsubscribeFromGlobalKeyboardEvents();
}
}
privatestaticeventMouseEventHandlers_MouseMove;
privatestaticeventMouseEventHandlers_MouseClick;
privatestaticeventMouseEventHandlers_MouseDown;
privatestaticeventMouseEventHandlers_MouseUp;
privatestaticeventMouseEventHandlers_MouseWheel;
privatestaticeventMouseEventHandlers_MouseDoubleClick;
privatestaticMouseButtonss_PrevClickedButton;
privatestaticTimers_DoubleClickTimer;
privatestaticvoidDoubleClickTimeElapsed(objectsender,EventArgse)
{
s_DoubleClickTimer.Enabled=false;
s_PrevClickedButton=MouseButtons.None;
}
privatestaticvoidOnMouseUp(objectsender,MouseEventArgse)
{
if(e.Clicks<1)
{
return;
}
if(e.Button.Equals(s_PrevClickedButton))
{
if(s_MouseDoubleClick!
=null)
{
s_MouseDoubleClick.Invoke(null,e);
}
s_DoubleClickTimer.Enabled=false;
s_PrevClickedButton=MouseButtons.None;
}
else{
s_DoubleClickTimer.Enabled=true;
s_PrevClickedButton=e.Button;
}
}
privatestaticeventKeyPressEventHandlers_KeyPress;
privatestaticeventKeyEventHandlers_KeyUp;
privatestaticeventKeyEventHandlers_KeyDown;
privateconstintWH_MOUSE_LL=14;
privateconstintWH_KEYBOARD_LL=13;
privateconstintWM_LBUTTONDOWN=0x201;
privateconstintWM_RBUTTONDOWN=0x204;
privateconstintWM_LBUTTONUP=0x202;
privateconstintWM_RBUTTONUP=0x205;
privateconstintWM_LBUTTONDBLCLK=0x203;
privateconstintWM_RBUTTONDBLCLK=0x206;
privateconstintWM_MOUSEWHEEL=0x020A;
privateconstintWM_KEYDOWN=0x100;
privateconstintWM_KEYUP=0x101;
privateconstintWM_SYSKEYDOWN=0x104;
privateconstintWM_SYSKEYUP=0x105;
privateconstbyteVK_SHIFT=0x10;
privateconstbyteVK_CAPITAL=0x14;
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
privatestaticexternintCallNextHookEx(
intidHook,
intnCode,
intwParam,
IntPtrlParam);
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall,SetLastError=true)]
privatestaticexternintSetWindowsHookEx(
intidHook,
HookProclpfn,
IntPtrhMod,
intdwThreadId);
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall,SetLastError=true)]
privatestaticexternintUnhookWindowsHookEx(intidHook);
[DllImport("user32")]
privatestaticexternintGetDoubleClickTime();
[DllImport("user32")]
privatestaticexternintToAscii(
intuVirtKey,
intuScanCode,
byte[]lpbKeyState,
byte[]lpwTransKey,
intfuState);
[DllImport("user32")]
privatestaticexternintGetKeyboardState(byte[]pbKeyState);
[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
privatestaticexternshortGetKeyState(intvKey);
[StructLayout(LayoutKind.Sequential)]
privatestructPoint
{
internalreadonlyintX;
internalreadonlyintY;
}
[StructLayout(LayoutKind.Sequential)]
privatestructMouseLLHookStruct
{
internalPointPoint;
internalreadonlyintMouseData;
privatereadonlyintFlags;
privatereadonlyintTime;
privatereadonlyintExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
privatestructKeyboardHookStruct
{
internalreadonlyintVirtualKeyCode;
internalreadonlyintScanCode;
internalreadonlyintFlags;
privatereadonlyintTime;
privatereadonlyintExtraInfo;
}
privatedelegateintHookProc(intnCode,intwParam,IntPtrlParam);
privatestaticHookProcs_MouseDelegate;
privatestaticints_MouseHookHandle;
privatestaticintm_OldX;
privatestaticintm_OldY;
privatestaticintMouseHookProc(intnCode,intwParam,IntPtrlParam)
{
if(nCode>=0)
{
varmouseHookStruct=(MouseLLHookStruct)Marshal.PtrToStructure(lParam,typeof(MouseLLHookStruct));
varbutton=MouseButtons.None;
shortmouseDelta=0;
varclickCount=0;
varmouseDown=false;
varmouseUp=false;
switch(wParam)
{
caseWM_LBUTTONDOWN:
mouseDown=true;
button=MouseButtons.Left;
clickCount=1;
break;
caseWM_LBUTTONUP:
mouseUp=true;
button=MouseButtons.Left;
clickCount=1;
break;
caseWM_LBUTTONDBLCLK:
button=MouseButtons.Left;
clickCount=2;
break;
caseWM_RBUTTONDOWN:
mouseDown=true;
button=MouseButtons.Right;
clickCount=1;
break;
caseWM_RBUTTONUP:
mouseUp=true;
button=MouseButtons.Right;
clickCount=1;
break;
caseWM_RBUTTONDBLCLK:
button=MouseButtons.Right;
clickCount=2;
break;
caseWM_MOUSEWHEEL:
mouseDelta=(short)((mouseHookStruct.MouseData>>16)&0xffff);
break;
}
vare=newMouseEventExtArgs(
button,
clickCount,
mouseHookStruct.Point.X,
mouseHookStruct.Point.Y,
mouseDelta);
if(s_MouseUp!
=null&&mouseUp)
{
s_MouseUp.Invoke(null,e);
}
if(s_MouseDown!
=null&&mouseDown)
{
s_MouseDown.Invoke(null,e);
}
if(s_MouseClick!
=null&&clickCount>0)
{
s_MouseClick.Invoke(null,e);
}
if(s_MouseDoubleClick!
=null&&clickCount==2)
{
s_MouseDoubleClick.Invoke(null,e);
}
if(s_MouseWheel!
=null&&mouseDelta!
=0)
{
s_MouseWheel.Invoke(null,e);
}
if((s_MouseMove!
=null)&&(m_OldX!
=mouseHookStruct.Point.X||m_OldY!
=mouseHookStruct.Point.Y))
{
m_OldX=mouseHookStruct.Point.X;
m_OldY=mouseHookStruct.Point.Y;
if(s_MouseMove!
=null)
{
s_MouseMove.Invoke(null,e);
}
}
if(e.Handled)
{
return-1;
}
}
returnCallNextHookEx(s_MouseHookHandle,nCode,wParam,lParam);
}
privatestaticvoidEnsureSubscribedToGlobalMouseEvents()
{
if(s_MouseHookHandle!
=0)
{
return;
}
s_MouseDelegate=MouseHookProc;
s_MouseHookHandle=SetWindowsHookEx(
WH_MOUSE_LL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 鼠标 键盘 操作 全局 钩子 较好
![提示](https://static.bdocx.com/images/bang_tan.gif)