钩子是Windows中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程
来监视系统里的消息传递以及在这些消息到达目的地之前截获它们并根据用户要求做出相应处理。钩子
的种类很多其作用也不同,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以
截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件。钩子分为线程专用钩子和全局钩
子,线程专用钩子只监视指定的线程,要监视系统中的所有线程,必须用到全局钩子。对于全局钩子,
钩子函数必须包含在独立的动态链接库(DLL)中,这样才能被各种相关联的应用程序调用。
一、钩子函数简介
Windows提供API函数SetwindowsHookEx来建立一个Hook,通过这个函数可以将一个程序添加到Hook
链中监视Windows消息,函数语法为:
SetwindowsHookEx (idHook:Integer;lpfn:TFNHookProc;hmod: HINST;dwThreadId:DWORD)
其中参数idHook指定建立的监视函数类型。通过Windows MSDN帮助可以看到,SetwindowsHookEx函
数提供15种不同的消息监视类型,而WH_JOURNALRECORD和WH_JOURNALPLAYBACK是用来监视键盘和鼠标操
作的。参数lpfn指定消息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处
理。函数的一般形式为:
Hookproc (icode:Integer;wparam:WPARAM;lparam:LPARAM):LRESULT;stdcall;
其中icode为系统指示标记,wParam和lParam为附加参数,根据不同的消息监视类型而不同。只要
在程序中建立这样一个函数再通过SetwindowsHookEx函数将它加入到消息监视链中就可以处理消息了。
在不需要监视系统消息时可以调用UnHookWindowsHookEx来解除对消息的监视。WH_JOURNALRECORD和
WH_JOURNALPLAYBACK类型是两种相反的Hook类型,前者获得鼠标、键盘动作消息,后者回放鼠标、键盘
消息。
二、钩子程序的实例
在本程序中建立了两个消息函数,一个用于纪录鼠标、键盘的动作并保存,另一个用于将保存的动
作返给系统回放。在Delphi中建立一个工程,在Form1上添加3个按钮用于程序操作。另外再添加一个
Edit控件用于验证操作