一 什么时候用到钩子?(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. Socket网络编程--Libev库学习(1)

    这一节是安装篇. Socket网络编程不知不觉已经学了快两个月了.现在是时候找个网络库学学了.搜索了很多关于如何学网络编程的博客和问答.大致都是推荐学一个网络库,至于C++网络库有那么几个,各有各的好 ...

  2. 简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理)

    博弈论入门: 巴什博弈: 两个顶尖聪明的人在玩游戏,有一堆$n$个石子,每次每个人能取$[1,m]$个石子,不能拿的人输,请问先手与后手谁必败? 我们分类讨论一下这个问题: 当$n\le m$时,这时 ...

  3. spoj COT - Count on a tree (树上第K小 LCA+主席树)

    链接: https://www.spoj.com/problems/COT/en/ 思路: 首先看到求两点之前的第k小很容易想到用主席树去写,但是主席树处理的是线性结构,而这道题要求的是树形结构,我们 ...

  4. Educational Codeforces Round 4 B. HDD is Outdated Technology

    题目链接:http://codeforces.com/problemset/problem/612/B 解题思路: 一开始看错了题意,他要求的是从1-n所耗费的时间,n表示的是数值而不是下标, 实现代 ...

  5. MT【56】2017联赛一试解答最后一题:一道复数题的几何意义

  6. 【刷题】AtCoder Regular Contest 002

    A.うるう年 题意:判断闰年 做法:.. #include<bits/stdc++.h> #define ui unsigned int #define ll long long #def ...

  7. 09 Zabbix Item类型之Zabbix SNMP类型

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Zabbix Item类型之Zabbix SNMP类型 SNMP是监控服务器以外设备的非常好的方式 ...

  8. 自学Zabbix11.1 Zabbix 配置SNMP监控

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix11.1 Zabbix 配置SNMP监控 1. 概述 zabbix采集数据方式: ...

  9. 【BZOJ1800】[AHOI2009]飞行棋(暴力)

    [BZOJ1800][AHOI2009]飞行棋(暴力) 题面 BZOJ 洛谷 题解 预处理一下前缀和就可以\(O(1)\)计算两点间的距离了,直接\(O(n^4)\)暴力枚举即可. #include& ...

  10. AutoCompleteTextView和自定义的CursorAdapter

    用雅虎天气接口和AutoCompleteTextView开发天气应用(1) 2014/03/20 | 分类: ANDROID, 开发 | 2 条评论 | 标签: 天气, 安卓开发 分享到:5 jQue ...