




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c# 钩子Hook(钩子)是WINDOWS提供的一种消息处理机制平台,是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。注意:安装钩子函数将会影响系统的性能。监测“系统范围事件”的系统钩子特别明显。因为系统在处理所有的相关事件时都将调用您的钩子函数,这样您的系统将会明显的减慢。所以应谨慎使用,用完后立即卸载。还有,由于您可以预先截获其它进程的消息,所以一旦您的钩子函数出了问题的话必将影响其它的进程。记住:功能强大也意味着使用时要负责任。钩子2HOOK链WINDOWS提供了14种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。WINDOWS为这几种HOOKS维护着各自的HOOK链表。HOOK链表是一串由应用程序定义的回调函数(CALLBACK Function)队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数(HOOK链的顶部)发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)一些Hook子过程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子过程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。3钩子的作用范围一共有两种范围(类型)的钩子:局部的和远程的(别人的.相对于自己都是远的)。一、局部钩子仅钩挂您自己进程的事件。二、远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种:1、基于线程的 它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。2、系统范围的 将捕捉系统中所有进程将发生的事件消息。现在 开始操练 一下首先你要调动win32 API 函数的准备工作,声明(根据查找资料,需要调用委托三个参数)public delegate int HOOKPROC(int nCode,int wParam,IntPtr lParam);DllImport(user32.dll, CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)public static extern int SetWindowsHookEx(HookType idHook,HOOKPROC Ipfn,IntPtr hInsTance, int threadId);DllImport(user32.dll, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)public static extern bool UnhookWindowsHookEx(int idHook);DllImport(user32.dll, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);/ 取得当前线程编号(线程钩子需要用到)DllImport(kernel32)public static extern int GetCurrentThreadId();根据声明需要知道/定义钩子句柄 int hHook = 0;/定义钩子的类型 int WH_KEYBOARD_LL=13(好像十四个,忘记了)/定义钩子的处理函数 public HOOKPROC proc; 在这里使用的是委托/定义结构,这里是键盘结构StructLayout(LayoutKind.Sequential) public class KeyboardHookStruct public int vkCode;public int scanCode; public int flags; public int time; public int dwExtraInfo; 设置钩子 public override int SetWindowsHookEx() /GetHINSTANCE(hinstance)返回指定模块的实例句柄 (HINSTANCE) if (hHook = 0)hHook = SetWindowsHookEx(类型, 委托, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()0), 0);(如果是私有钩子的话)if (hHook = 0)hHook = SetWindowsHookEx(this.type, c, IntPtr.Zero, GetCurrentThreadId(); return hHook; /卸载钩子public void UnhookWindowsHookEx()bool retKeyboard = true;if (hHook != 0)retKeyboard = UnhookWindowsHookEx(hHook);hHook = 0;if (!retKeyboard)throw new Exception(UnhookWindowsHookEx failed.);/这里是委托调用的的方法不管您安装的是那一类型钩子,钩子函数的原型都时是一样的,语法如下:public int MyHook(int nCode, Int32 wParam, IntPtr lParam)/处理代码public int MyKeyboardProc(int nCode, int wParm, IntPtr lParam)/Marshal / 提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。/PtrToStructure 将数据从非托管内存块封送到新分配的指定类型的托管对象。 ptr(Intptr)to (组织)Structure/键盘结构KeyboardHookStruct kbh =(KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct);if (kbh.vkCode = (int)Keys.S & (int)Control.ModifierKeys = (int)Keys.Control) / 截?获?F8MessageBox.Show(快捷键不能保存);return 1;注意事项下面备注一下在使用过程中一些类库说明及注意事项:1、AppDomain.GetCurrentThreadId()在.net 2.0中过时了,VS2005和VS2008警告这个方法已经过时,建议使用System.Threading.Thread.CurrentThread.ManagedThreadId,但实际上这两个值是不一样的。AppDomain.GetCurrentThreadId()的实际上调用Win32 API,其返回的是该线程在Windows中的ThreadId,即同这个等价:DllImport(kernel32)public static extern int GetCurrentThreadId();而System.Threading.Thread.CurrentThread.ManagedThreadId返回的是作为一个ManagedThread在.Net CLR中的ThreadId,所以这和Windows的ThreadId是完全不同的。22、使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个Hook子程需要调用CallNextHookEx函数.函数签名如下:DllImport(user32.dll, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);3、系统钩子和线程钩子:SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。线程勾子用于监视指定线程的事件消息。线程勾子一般在当前线程或者当前线程派生的线程内。4、钩子处理函数:public int MyKeyboardProc(int nCode, int wParm, int lParam)注意:如果返回1,则结束消息,这个消息到此为止,不再传递。如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者.5 SetWindowsHookEx /关于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函数将钩子加入到钩子链表中,说明一下四个参数: /idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13, /线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。lpfn 钩子子程的地址指针。如果dwThreadId参数为0 或是一个由别的进程创建的 /线程的标识,lpfn必须指向DLL中的钩子子程。 除此以外,lpfn可以指向当前进程的一段钩子子程代码。钩子函数的入口地址,当
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东工程数学自考试题及答案
- 控制测量考试题及答案
- 2025年中国平烫机数据监测研究报告
- 四川省广元市川师大万达中学2025-2026学年高二上学期第一次月考(8月)英语试题(原卷版)
- 康复考试题型及答案
- 木材保护与改性处理工综合考核试卷及答案
- 钻车司机三级安全教育(车间级)考核试卷及答案
- 钒铁熔化还原工工艺创新考核试卷及答案
- 餐厨垃圾处理工职业技能考核试卷及答案
- 课件文本框汉字输入问题
- 方坯连铸机图解课件
- 湘教版地理必修一知识点复习
- 热控安装工程施工方案
- 河南单招院校名单
- 医院水、电、气故障报修、排查、处理流程1
- 钢结构厂房旁站监理方案
- 开关电源测试表格
- 公路客运站管理规定
- 自动控制原理全套ppt课件(完整版)
- 建筑公司组织架构及岗位职责
- 安全帽试验作业指导书实施细则
评论
0/150
提交评论