一 什么时候用到钩子?(when)
Windows操作系统是建立在事件驱动的消息处理机制之上,系统各部分之间的沟通也都是通过消息的相互传递而实现的。通常情况下,应用程序只能处理当前进程的消息,如果需要对其它进程的消息进行拦截处理就必须采钩子技术。
二 什么是钩子?(what)
钩子实际上是一段用以处理系统消息的程序(钩子函数),通过系统调用,将其挂入到系统。每当特定的消息发出,在没有到达目标窗口前,钩子程序就先捕获该消息,即钩子函数先得到控制权。在钩子函数中,可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。钩子函数是一个应用程序定义的回调函数,不能定义成某个类的成员函数,只能定义为普通的C函数。
三 什么是钩子链表?(what)
系统提供多种不同类型的钩子用于处理不同的消息。在某一时刻可能有多个进程安装了相同类型的钩子,即同一种钩子有多个不同的钩子处理函数。这多个不同的钩子处理函数的指针构成了钩子链表,由操作系统维护。当某种类型的消息发生时系统向该类型的钩子链表的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的钩子,不管钩子链中的函数是否向下传递消息,与此类型钩子关联的所有钩子函数都会收到系统发送的消息)最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。系统并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,系统便释放其占用的内存,并更新整个钩子链表。如果应用程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动卸载钩子。
四 钩子的作用范围(where)
   一共有两种范围(类型)的钩子:局部的和远程的。
   1.局部钩子仅钩挂您自己进程的事件。
   2.远程的钩子还可以将钩挂其它进程发生的事件。
   远程的钩子又有两种:
   2.1 基于线程的它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。
   2.2系统范围的将捕捉系统中所有进程将发生的事件消息。

五 钩子的使用步骤(How)
   1 安装钩子
     SetWindowsHookEx函数可以把应用程序定义的钩子函数安装到系统中。
     HHOOK SetWindowsHookEx(
       int idHook ;   // 指定钩子的类型
       HOOKPROC lpfn; //钩子函数的地址。如果是远程钩子,钩子函数必须放在一个DLL中。
       HINSTANCE hMod; // 钩子函数所在的DLL的实例句柄。局部的钩子,该参数为NULL。
       DWORD  dwThreadID; //指定要为哪个线程安装钩子。若该值为0被解释成系统范围内的。
     );

2 定义钩子函数
     钩子函数的一般形式如下:
     LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
       // 处理该消息的代码 …..
 
       Return ::CallNextHookEx(hHook,nCode,wParam,lParam);
    }

HookProc是钩子函数的名称。nCode参数是Hook代码,钩子函数使用这个参数来确定任务,它的值依赖于Hook的类型。wParam和lParam参  
数的值依赖于Hook代码,但是它们典型的值是一些关于发送或者接收消息的信息。因为系统中可能会有多个钩子的存在,所以要调用那个   
CallNextHookEx函数把消息传到链中下一个钩子函数。hHook参数是安装钩子时得到的钩子句柄(SetWindowsHookEx的返回值)。

3 卸载钩子
    要卸载钩子,可以调用UnhookWindowsHookEx函数。
    BOOL UnhookWindowsHookEx(HHOOK hhk); // hhk 为要卸载的钩子的句柄
    注意:
    安装钩子的代码可以在DLL模块中,也可以在主模块中,但是一般在DLL里实现它,主要是为了使程序更加模块化。
六 钩子的几个实例
   
七 钩子的几点总结
1.钩子是用截获系统中的消息流。利用钩子,可以处理任何感兴趣的消息,包括其他进程的消息。
2.截获消息后,用于处理消息的子程序叫做钩子函数,它是应用程序自定义的一个函数,在安装钩子时要把这个函数的地址告诉系统。
3.在操作系统中,同一时间可能有多个进程安装了同一种类型的钩子,即会有多个钩子函数,多个钩子函数在一起组成钩子链。所以在处理截获到的消息时,应该把消息事件传递下去,以便其他钩子函数也有机会处理这一消息。
4.钩子会使得系统变慢,因为它增加了系统对每个消息的处理量。仅应该在必要时才安装钩子,而且在不需要时应尽快移除。

windows钩子函数的更多相关文章

  1. 利用钩子函数来捕捉键盘响应的windows应用程序

    一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到 ...

  2. 用Delphi实现Windows的鼠标钩子函数

    Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助文件中,对Windows API函数的说明沿袭了 VC 的格式,和VC一样,对很多API函数的用法没有 ...

  3. 使用PreTranslateMessage替代钩子函数处理键盘消息

    2002年左右,我所在公司在开发基于H.323的VoIP电话系统(用了以色列一家公司的库,具体名字忘记了). 去电信科技研究院测试系统,同事发现处理键盘消息总有一些莫名其妙的问题,比如延迟或异常. 我 ...

  4. 10.PHP内核探索:Apache运行与钩子函数

    Apache是目前世界上使用最为广泛的一种Web Server,它以跨平台.高效和稳定而闻名.按照去年官方统计的数据,Apache服务器的装机量占该市场60%以上的份额.尤其是在 X(Unix/Lin ...

  5. php 钩子函数原理 解析

    目前对钩子的理解:<转载:http://www.cnblogs.com/del/archive/2008/02/25/1080825.html> 譬如我们用鼠标在某个窗口上双击了一次, 或 ...

  6. HOOK钩子 - 钩子函数说明

    翻译参考自MaybeHelios的blog: http://blog.csdn.net/maybehelios/ 通过SetWindowsHookEx方法安装钩子,该函数指定处理拦截消息的钩子函数(回 ...

  7. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  8. 钩子函数mounted:

    1.钩子函数 钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息.事件进行过滤,访问在正常情况下无法访问的消息.钩子的本质是一段用以处理系统消息的程序,通过 ...

  9. windows钩子(转)

    1. 消息钩子 提示: 如果要设置系统级钩子, 钩子函数必须在 DLL 中. SetWindowsHookEx(   idHook: Integer;  {钩子类型}   lpfn: TFNHookP ...

随机推荐

  1. TM数据

    qatestjr_xuyue10@vipabc.comqatestjr_xuyue01@vipabc.com jrNHc2 jUBRTEqatestjr_nianyue@vipabc.com QE9E ...

  2. 日志收集-Elk6

    一:前言 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件.新增了一个FileBeat,它是一个轻量级的日志收集处理工具(A ...

  3. Java递归删除目录下所有的txt文件

    public static void delAllFile(File path) { if (!path.exists() || !path.isDirectory()) { //不是目录 retur ...

  4. git报错failed to push some refs to 'git@github.com:Markprint/github.git'

     这个不知名小错误用了我两天的空余时间mmp   就是这里报的错 输入 git push origin master -f 解释为: 远程分支上存在本地分支中不存在的提交,往往是多人协作开发过程中遇到 ...

  5. 自学Aruba7.2-Aruba安全认证-Portal认证(web页面配置)

    点击返回:自学Aruba之路 自学Aruba7.2-Aruba安全认证-Portal认证(web页面配置) 步骤1 建立AP Group,命名为testportal-group 步骤2  将AP加入到 ...

  6. harmakik

    Solution 对于原树一个节点\(x\): \(f_x(h)\)表示,\(x\)作为一个深度为\(h\)的点时,\(x\)及其子树的安排方案有多少(不考虑\(x\)具体在深度为\(h\)的哪个点) ...

  7. 洛谷 P3705 [SDOI2017]新生舞会 解题报告

    P3705 [SDOI2017]新生舞会 题目描述 学校组织了一次新生舞会,\(Cathy\)作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个 ...

  8. luogu2607/bzoj1040 [ZJOI2008]骑士 (基环树形dp)

    N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几 ...

  9. [HEOI2013]SAO ——计数问题

    题目大意: Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...

  10. poj 3678(SCC+2-SAT)

    传送门:Problem 3678 https://www.cnblogs.com/violet-acmer/p/9769406.html 难点: 题意理解+构图 题意: 有n个点 v[0,2..... ...