C#实现全局钩子步骤

怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么让C#实现全局钩子呢?于是开始到网上搜索,好不容易找到一篇,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处理过程。

 
 
 
  1. [DllImport(\"user32.dll\",CharSetCharSet=CharSet.Auto,  
  2. CallingConventionCallingConvention=CallingConvention.StdCall,SetLastError=true)]  
  3. privatestaticexternintSetWindowsHookEx(  
  4. intidHook,  
  5. HookProclpfn,  
  6. IntPtrhMod,  
  7. intdwThreadId);  
  8.  
  9. [DllImport(\"user32.dll\",CharSetCharSet=CharSet.Auto,  
  10. CallingConventionCallingConvention=CallingConvention.StdCall,SetLastError=true)]  
  11. privatestaticexternintUnhookWindowsHookEx(intidHook);  
  12.  
  13. [DllImport(\"user32.dll\",CharSetCharSet=CharSet.Auto,  
  14. CallingConventionCallingConvention=CallingConvention.StdCall)]  
  15. privatestaticexternintCallNextHookEx(  
  16. intidHook,  
  17. intnCode,  
  18. intwParam,  
  19. IntPtrlParam); 

有关这两个low-level hook在Winuser.h中的定义

 
 
 
  1.  
  2. ///WindowsNT/2000/XP:
    Installsahookprocedurethatmonitorslow-levelmouseinputevents.  
  3. ///[Page]  
  4. privateconstintWH_MOUSE_LL=14;  
  5. /**//// 
  6. ///WindowsNT/2000/XP:
    Installsahookprocedurethatmonitorslow-levelkeyboardinputevents.  
  7. /// 
  8. privateconstintWH_KEYBOARD_LL=13; 

在安装全局钩子的时候,我们就要做替换了,将WH_MOUSE和WH_KEYBORAD分别换成WH_MOUSE_LL和WH_KEYBORAD_LL:

 
 
 
  1. //installhook  
  2. hMouseHook=SetWindowsHookEx(  
  3. WH_MOUSE_LL, //原来是WH_MOUSE  
  4. MouseHookProcedure,  
  5. Marshal.GetHINSTANCE(  
  6. Assembly.GetExecutingAssembly().GetModules()[0]),  
  7. 0);  
  8.  
  9. //installhook  
  10. hKeyboardHook=SetWindowsHookEx(  
  11.  
  12. WH_KEYBOARD_LL,//原来是WH_KEYBORAD  
  13. KeyboardHookProcedure,  
  14. Marshal.GetHINSTANCE(  
  15. Assembly.GetExecutingAssembly().GetModules()[0]),  
  16. 0);[Page] 

这样替换了之后,我们就可以C#实现全局钩子了,而且,不需要写DLL。看一下程序运行情况:

下面是关于鼠标和键盘的两个Callback函数:

 
 
 
  1. private int MouseHookProc(int nCode, int wParam, IntPtr lParam)  
  2. {  
  3. // if ok and someone listens to our events  
  4. if ((nCode >= 0) && (OnMouseActivity != null))  
  5. {  
  6. //Marshall the data from callback.  
  7. MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.
    PtrToStructure(lParam, typeof(MouseLLHookStruct));  
  8.  
  9. //detect button clicked  
  10. MouseButtons button = MouseButtons.None;  
  11. short mouseDelta = 0;  
  12. switch (wParam)  
  13. {  
  14. case WM_LBUTTONDOWN:  
  15. //case WM_LBUTTONUP:   
  16. //case WM_LBUTTONDBLCLK:   
  17. button = MouseButtons.Left;  
  18. break; [Page]  
  19. case WM_RBUTTONDOWN:  
  20. //case WM_RBUTTONUP:   
  21. //case WM_RBUTTONDBLCLK:   
  22. button = MouseButtons.Right;  
  23. break;  
  24. case WM_MOUSEWHEEL:  
  25. //If the message is WM_MOUSEWHEEL, 
    the high-order word of mouseData member is the wheel delta.   
  26. //One wheel click is defined as WHEEL_DELTA, which is 120.   
  27. //(value >> 16) & 0xffff; retrieves the high-order word from the given 32-bit value  
  28.  
  29. mouseDelta = (short)((mouseHookStruct.mouseData >> 16) & 0xffff);  
  30. //TODO: X BUTTONS (I havent them so was unable to test)  
  31. //If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, 
    WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP,[Page]  
  32. //or WM_NCXBUTTONDBLCLK, 
    the high-order word specifies which X button was pressed or released,  
  33. //and the low-order word is reserved. 
    This value can be one or more of the following values.  
  34. //Otherwise, mouseData is not used.  
  35. break;  

【编辑推荐】

  1. C# Iterator迭代器模式
  2. 概述C# New运算符
  3. C# WiteOne学习笔记
  4. 用C# ListView显示数据记录
  5. C# ConfigDlg.cs源程序

名称栏目:C#实现全局钩子步骤
网站链接:http://www.mswzjz.cn/qtweb/news29/420379.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能