|
(一)为什么要用钩子函数
众所周知,在DOS操作系统下,用户常常可以通过截获有关的软中断,来对原有的程序进行修改,实现特有的功能。同样在WINDOWS环境下,用户也可以对原有的WINDOWS程序进行修改,实现象对英文WINDOWS程序的汉化等的功能。这就要涉及到如何获取WINDOWS应用程序运行时所发出消息的问题。你可以通过钩子函数来解决这一问题。 (二)钩子函数简介 1.有关概念 a.钩子 钩子是微软WINDOWS消息处理机构中的留给应用程序的一种处理手段,通过钩子函数应用程序可以安装一个钩子函数来监视系统中消息的往来,还能在消息达到目的窗口之前处理某种类型的消息。 b.钩子链 WINDOWS系统中含有多种不同类型的钩子,每种都提供一种WINDOWS系统消息处理机构不同方面的通路。 WINDOWS系统为每一种类型的钩子管理一个对立的钩子链。钩子链是一个指向特殊的称为钩子函数的应用程序定义的回调函数的指针列表。如果有与某种特定类型的钩子相应的消息,WINDOWS系统则把这一消息一个接一个的传给钩子链中指定的钩子函数。其中的每一个钩子函数决定是否把事件传给下一个过程,钩子函数是通过调用函数CallNextHookEx来实现的。钩子函数的操作取决于钩子的类型。 钩子有可能减低系统性能,因为它们增加了系统的每一条消息进行处理的总量。 2.实现方法 WINDOWS提供了许多种钩子函数,安装和卸载这些钩子函数的方法是相同的。即系统通过SetWindowsHookEx函数安装一个钩子函数,其语法为: HHOOK SetwindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId ); 参数含义: idHook:安装钩子的类型。 lpfn:钩子函数地址(回调函数)。 hmod:钩子函数所在程序的实例句柄。 dwThreadId:为NULL时,表示安装的是全局钩子函数。 系统通过UnhookWindowsHookEx函数卸载一个指定钩子函数,其语法为: BOOL UnhookWindowsHookEx( HHOOK hhk ); 参数含义: hhk:将要卸载的钩子函数的句柄。 系统通过CallNextHookEx函数传递事件,其语法为: LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ); 参数含义: hhk:将要卸载的钩子函数的句柄。 注意事项: 由于钩子函数即可监视系统中所有线程的消息,也可以监视某个特定的线程。由于全局钩子函数可以被任何应用程序调用,所以钩子函数必须放在一个独立的动态链接库中,而某一线程特有的钩子函数只由相应的线程调用,因此,它的钩子函数即可放到应用程序代码中也可放到一个动态链接库中。如果钩子函数是放在动态链接库中的,则参数hmod应为包含该钩子函数的DLL模块的句柄。 (三)钩子函数种类 不同的钩子允许应用程序监视WINDOWS消息处理机构中的不同方面,具体有以下这些种类: 1.WH_CALLWNDPROC 允许应用程序监视由SendMessage发给窗口过程的消息。WINDOWS系统在把这条消息传递给窗口之前,先传给该钩子函数。其作用范围为线程或系统。 2.WH_CALLWNDPROCRET 允许应用程序监视被目标窗口过程处理后的消息。其作用范围为线程或系统。 3.WH_CBT WINDOWS系统在激活,创建,销毁,极大化,极小化,移动或改变一个窗口的大小事件之前;在完成一个系统命令之前;在从系统队列中删除一个鼠标或键盘事件之前;在设置输入焦点之前;在于系统消息队列同步之前,系统都要先调用该钩子。窗口过程的返回值取决于WINDOWS系统是允许或禁止其中的某个操作。该钩子主要用于WINDOWS基于计算机训练的应用系统。其作用范围为线程或系统。 4.WH_GETMESSAGE 允许应用程序监视由GetMessage和PeekMessage函数返回的消息。应用程序可用其来监视鼠标和键盘的输入以及其他投递到队列的消息。其作用范围为线程或系统。 5.WH_DEBUG WINDOWS系统在调用系统中任何其他钩子相应的钩子过程之前都要先调用该钩子过程函数。应用程序可以用这个钩子来确定是否允许其他类型的钩子函数响应。其作用范围为线程或系统。 6.WH_JOURNALRECORD 允许应用程序监视和记录输入事件。应用程序可以用这个钩子来记录一系列的鼠标和键盘消息。其作用范围为系统。 7.WH_JOURNALPLAYBACK 允许应用程序将消息插入到系统消息队列,应用程序可以用这个钩子来重放由WH_JOURNALRECORD钩子所记录的一系列鼠标和键盘消息。该钩子返回一个超时值,告诉系统在处理重放钩子的当前消息之前要等多少毫秒,即允许钩子来控制它重放事件的记时。其作用范围为线程或系统。 8.WH_KEYBOARD 允许应用程序监视GetMessage和PeekMessge函数返回的WM_KEYDOWNHE和WM_KEYUP消息的往来。应用程序可以用这个钩子来监视投递到消息队列的键盘输入。其作用范围为线程或系统。 9.WH_MOUSE 允许应用程序监视GetMessage和PeekMessge函数返回的鼠标消息。应用程序可以用这个钩子来监视投递到消息队列的鼠标输入消息。其作用范围为线程或系统。 10.WH_HARDWARE 允许应用程序监视GetMessage和PeekMessge函数返回的非鼠标或键盘的硬件消息。其作用范围为线程或系统。 11.WH_SHELL 允许WINDOWS系统SHELL应用程序检索重要的通知(如一重叠窗口被生成或撤消)。WINODWS系统在应用程序将要被激活以及顶层窗口创建或销毁时调用该钩子过程。其作用范围为线程或系统。 12.WH_MSGFILTER 允许应用程序监视传给安装钩子过程的应用程序创建的菜单,滚动条,消息框,对话框的消息以及由[ALT+TAB]或[ALT+ESC]组合键激活另一窗口的情况。其作用范围为线程或系统。 13.WH_SYSMSGFILTER 该钩子同WH_MSGFILTER钩子功能基本一致,只是该钩子为所有应用程序监视上述消息。 |