首页 > 学院 > 开发设计 > 正文

如何在C#中使用全局鼠标、键盘Hook

2019-11-17 03:04:22
字体:
来源:转载
供稿:网友
如何在C#中使用全局鼠标、键盘Hook

今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全局钩子呢?于是开始到网上搜索,好不容易找到一篇,318804 - HOW TO: Set a Windows Hook in Visual C# .NET,里面详细的说明了如何使用鼠标钩子捕获鼠标的移动等,可是,它只能在application里起作用,出了Application就没用了,就是说它还是没有实现全局钩子,而且文章结尾处说:“Global Hooks are not supported in the .NET Framework...”,这可怎么办呢?  别担心,办法总是有的,经过一番摸索以后,发现WH_KEYBORAD_LL和WH_MOUSE_LL这两个low-level的hook可以被安装成全局的,这就好办了,我们不妨用这两个low-level的hook替换掉WH_KEYBORAD和WH_MOUSE,于是开始测试。结果成功了,在C#里实现了全局钩子。  我们来看一下主要代码段。  首先倒入所需要的windows函数,主要有三个,SetWindowsHookEX用来安装钩子,UnhookWindowsHookEX用来卸载钩子以及CallNextHookEX用来将hook信息传递到链表中下一个hook处理过程。

C#代码Flashvars" value="clipboard=%5BDllImport(%22user32.dll%22%2C%20CharSet%20%3D%20CharSet.Auto%2C%0A%20%20%20%20%20%20%20%20%20%20%20CallingConvention%20%3D%20CallingConvention.StdCall%2C%20SetLastError%20%3D%20true)%5D%0A%20%20%20%20%20%20%20%20PRivate%20static%20extern%20int%20SetWindowsHookEx(%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20idHook%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20HookProc%20lpfn%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20IntPtr%20hMod%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20dwThreadId)%3B%0A%0A%5BDllImport(%22user32.dll%22%2C%20CharSet%20%3D%20CharSet.Auto%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20CallingConvention%20%3D%20CallingConvention.StdCall%2C%20SetLastError%20%3D%20true)%5D%0A%20%20%20%20%20%20%20%20private%20static%20extern%20int%20UnhookWindowsHookEx(int%20idHook)%3B%0A%0A%5BDllImport(%22user32.dll%22%2C%20CharSet%20%3D%20CharSet.Auto%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20CallingConvention%20%3D%20CallingConvention.StdCall)%5D%0A%20%20%20%20%20%20%20%20private%20static%20extern%20int%20CallNextHookEx(%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20idHook%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20nCode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20wParam%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20IntPtr%20lParam)%3B%0A%0A%E3%80%80%E3%80%80%E4%B8%8B%E9%9D%A2%E6%98%AF%E6%9C%89%E5%85%B3%E8%BF%99%E4%B8%A4%E4%B8%AAlow-level%20hook%E5%9C%A8Winuser.h%E4%B8%AD%E7%9A%84%E5%AE%9A%E4%B9%89%EF%BC%9A%0A%0A%0A%2F%2F%2F%20%3Csummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20Windows%20NT%2F2000%2FXP%3A%20Installs%20a%20hook%20procedure%20that%20monitors%20low-level%20mouse%20input%20events.%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3C%2Fsummary%3E%0A%20%20%20%20%20%20%20%20private%20const%20int%20WH_MOUSE_LL%20%20%20%20%20%20%20%3D%2014%3B%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3Csummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20Windows%20NT%2F2000%2FXP%3A%20Installs%20a%20hook%20procedure%20that%20monitors%20low-level%20keyboard%20input%20events.%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3C%2Fsummary%3E%0A%20%20%20%20%20%20%20%20private%20const%20int%20WH_KEYBOARD_LL%20%20%20%20%3D%2013%3B%0A%0A%E3%80%80%E3%80%80%E5%9C%A8%E5%AE%89%E8%A3%85%E5%85%A8%E5%B1%80%E9%92%A9%E5%AD%90%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E6%88%91%E4%BB%AC%E5%B0%B1%E8%A6%81%E5%81%9A%E6%9B%BF%E6%8D%A2%E4%BA%86%EF%BC%8C%E5%B0%86WH_MOUSE%E5%92%8CWH_KEYBORAD%E5%88%86%E5%88%AB%E6%8D%A2%E6%88%90WH_MOUSE_LL%E5%92%8CWH_KEYBORAD_LL%EF%BC%9A%0A%0A%0A%2F%2Finstall%20hook%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hMouseHook%20%3D%20SetWindowsHookEx(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WH_MOUSE_LL%2C%E3%80%80%2F%2F%E5%8E%9F%E6%9D%A5%E6%98%AFWH_MOUSE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MouseHookProcedure%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Marshal.GetHINSTANCE(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Assembly.GetExecutingAssembly().GetModules()%5B0%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200)%3B%0A%0A%2F%2Finstall%20hook%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hKeyboardHook%20%3D%20SetWindowsHookEx(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WH_KEYBOARD_LL%2C%20%2F%2F%E5%8E%9F%E6%9D%A5%E6%98%AFWH_KEYBORAD%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20KeyboardHookProcedure%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Marshal.GetHINSTANCE(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Assembly.GetExecutingAssembly().GetModules()%5B0%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200)%3B%0A%0A%E3%80%80%E3%80%80%E8%BF%99%E6%A0%B7%E6%9B%BF%E6%8D%A2%E4%BA%86%E4%B9%8B%E5%90%8E%EF%BC%8C%E6%88%91%E4%BB%AC%E5%B0%B1%E5%8F%AF%E4%BB%A5%E5%AE%9E%E7%8E%B0%E5%85%A8%E5%B1%80%E9%92%A9%E5%AD%90%E4%BA%86%EF%BC%8C%E8%80%8C%E4%B8%94%EF%BC%8C%E4%B8%8D%E9%9C%80%E8%A6%81%E5%86%99DLL%E3%80%82%E7%9C%8B%E4%B8%80%E4%B8%8B%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C%E6%83%85%E5%86%B5%EF%BC%9A%0A%0A%0A%0A%E3%80%80%E3%80%80%E4%B8%8B%E9%9D%A2%E6%98%AF%E5%85%B3%E4%BA%8E%E9%BC%A0%E6%A0%87%E5%92%8C%E9%94%AE%E7%9B%98%E7%9A%84%E4%B8%A4%E4%B8%AACallback%E5%87%BD%E6%95%B0%EF%BC%9A%0A%0A%0Aprivate%20int%20MouseHookProc(int%20nCode%2C%20int%20wParam%2C%20IntPtr%20lParam)%0A%0A%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20if%20ok%20and%20someone%20listens%20to%20our%20events%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20((nCode%20%3E%3D%200)%20%26%26%20(OnMouseActivity%20!%3D%20null))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FMarshall%20the%20data%20from%20callback.%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MouseLLHookStruct%20mouseHookStruct%20%3D%20(MouseLLHookStruct)Marshal.PtrToStructure(lParam%2C%20typeof(MouseLLHookStruct))%3B%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fdetect%20button%20clicked%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MouseButtons%20button%20%3D%20MouseButtons.None%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20short%20mouseDelta%20%3D%200%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20switch%20(wParam)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20WM_LBUTTONDOWN%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fcase%20WM_LBUTTONUP%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fcase%20WM_LBUTTONDBLCLK%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button%20%3D%20MouseButtons.Left%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20WM_RBUTTONDOWN%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fcase%20WM_RBUTTONUP%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fcase%20WM_RBUTTONDBLCLK%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button%20%3D%20MouseButtons.Right%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20WM_MOUSEWHEEL%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FIf%20the%20message%20is%20WM_MOUSEWHEEL%2C%20the%20high-order%20Word%20of%20mouseData%20member%20is%20the%20wheel%20delta.%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FOne%20wheel%20click%20is%20defined%20as%20WHEEL_DELTA%2C%20which%20is%20120.%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F(value%20%3E%3E%2016)%20%26%200xffff%3B%20retrieves%20the%20high-order%20word%20from%20the%20given%2032-bit%20value%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mouseDelta%20%3D%20(short)((mouseHookStruct.mouseData%20%3E%3E%2016)%20%26%200xffff)%3B%0A%0A%
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表