【转】 勾子---delphi


======================================================
注:本文源代码点此下载
======================================================

在windows系统中,勾子(hook)是一种特殊的消息处理机制。勾 子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的勾子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用勾子可以实现许多特殊而有用的功能。

勾子的类型

----1.按事件分类,有如下的几种常用类型

----(1)键盘勾子和低级键盘勾子可以监视各种键盘消息(wh_keyboard)。

----(2)鼠标勾子和低级鼠标勾子可以监视各种鼠标消息(wh_mouse)。

----(3)外壳勾子可以监视各种shell事件消息。比如启动和关闭应用程序(wh_shell)。

----(4)日志勾子可以记录从系统消息队列中取出的各种事件消息(wh_journalrecord,wh_journalplayback)。

----(5)窗口过程勾子监视所有从系统消息队列发往目标窗口的消息(wh_callwndproc)。

----(6)监视已被目标窗口函数处理的消息(wh_callwndprocre)。

----(7)接受与计算机训练有关的消息(wh_cbt).

----(8)应用程序前台空闲时调用的钩子(wh_foregroundidle).

----(9)监视加入到消息队列中的消(wh_getmessage).

----(10)监视由对话框消息菜单或者滚动条输入事件产生的消息(wh_msgfilter).

此外,还有一些特定事件的勾子提供给我们使用如:wh_mouse_ll,wh_keyboard_ll,wh_symsgfilter等等.

----2.按使用范围分类,主要有线程勾子和系统勾子

----(1)线程勾子监视指定线程的事件消息。

----(2)系统勾子监视系统中的所有线程的事件消息。因为系统勾子会影响系统中所有的应用程序,所以勾子函数必须放在独立的动态链接

库(dll)中。这是系统勾子和线程勾子很大的不同之处。

----几点需要说明的地方:

----(1)如果对于同一事件(如鼠标消息)既安装了线程勾子又安装了系统勾子,那么系统会自动先调用线程勾子,然后调用系统勾子。

----(2)对同一事件消息可安装多个勾子处理过程,这些勾子处理过程形成了勾子链。当前勾子处理结束后应把勾子信息传递给下一个勾子函数。

----(3)勾子特别是系统勾子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装勾子,在使用完毕后要及时卸载。

编写勾子程序

----编写勾子程序的步骤分为三步:定义勾子函数、安装勾子和卸载勾子。

----1.定义勾子函数

----勾子函数是一种特殊的回调函数。勾子监视的特定事件发生后,系统会调用勾子函数进行处理。不同事件的勾子函数的形式是各不相同的。下面以鼠标勾子函数举例说明勾子函数的原型:

lresultcallbackmouseproc

(intncode,wparamwparam,lparamlparam)

----参数wparam和lparam包含鼠标消息的信息,比如鼠标位置、状态等。ncode包含有关消息本身的信息,比如是否从消息队列中移出。

----我们先在勾子函数中实现自定义的功能,然后调用函数callnexthookex.把勾子信息传递给勾子链的下一个勾子函数。callnexthookex.的原型如下:

lresultcallnexthookex

(hhookhhk,intncode,

wparamwparam,lparamlparam)

----参数hhk是勾子句柄。ncode、wparam和lparam是勾子函数。下面的例子是一个简单的监视鼠标消息的勾子函数:

lresultcallbackmouseproc

(intncode,wparamwparam,lparamlparam)

{

//跟踪鼠标移动时的位置变化信息

if(wparam==wm_mousemove||wparam==

wm_ncmousemove)

{//是鼠标移动消息

point=((mousehookstruct*)

lparam)->pt;//取鼠标信息

trace2(“positionis:%d,y:%d\n",point.x,point.y);

}

//传递勾子信息

returncallnexthookex(hhook,ncode,wparam,lparam);

}

----2.安装勾子

----在程序初始化的时候,调用函数setwindowshookex安装勾子。其函数原型为:

hhooksetwindowshookex

(intidhook,hookproclpfn,

instancehmod,dworddwthreadid)

----参数idhook表示勾子类型,它是和勾子函数类型一一对应的。比如,wh_keyboard表示安装的是键盘勾子,wh_mouse表示是鼠标勾子等等。

----lpfn是勾子函数的地址。

----hmod是勾子函数所在的实例的句柄。对于线程勾子,该参数为null;对于系统勾子,该参数为勾子函数所在的dll句柄。

----dwthreadid指定勾子所监视的线程的线程号。对于全局勾子,该参数为null。

----setwindowshookex返回所安装的勾子句柄。

----3.卸载勾子

----当不再使用勾子时,必须及时卸载。简单地调用函数boolunhookwindowshookex(hhookhhk)即可。

----值得注意的是线程勾子和系统勾子的勾子函数的位置有很大的差别。线程勾子一般在当前线程或者当前线程派生的线程内,而系统勾子必须放在独立的动态链接库中,实现起来要麻烦一些。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值