首先我们先看一下安装HOOK 的函数: HHOOK SetWindowsHookEx( int idHook,//要安装的HOOK 的类型 HOOKPROC lpfn, //HOOK 的回调函数 HINSTANCE hMod,//进程 DWORD dwThreadId //程序的线程,如果为0 则是全局HOOK ); 熟悉了SetWindowsHookEx 函数,我们就能开始我们的工作,挂钩进程。 首先打开Delphi,创建一个 DLL 工程(DLL Wizard)。然后创建一个新的单元(Unit1)。 首先在单元的 interface 下面声明要用到的函数。 var OldHook:HHOOK; Histance:HISTANCE; OldProc:FARPROC; 我们的第一个函数是安装HOOK,让我们看一下代码: Function SetHook:Boolean;stdcall; begin OldHook:=SetWindowsHookEx(WH_KEYBOARD,@HookProc,Histance,0); if (OldHook=0) then exit else Result:=True; end; 这样的话就安装一个全局的键盘 HOOK,HOOK 的方法还有很多,在此就不一一列举了。 下面介绍一下回调函数: Function HookProc(nCode,wParam,lParam:Integer);Integer;stdcall; begin Result:=CallNextHookEx(OldHook,nCode,wParam,lParam); end; 这样的话就完成了对进程的挂钩。可是挂上钩我们的工作并没结束,相反,我们的工 作才刚刚开始。钩子的作用是帮我们把 DLL 注入到别人的进程空间。现在我们的DLL 已 经在别人的进程空间内。所以,我们就可以做我们想做的事。 下面介绍一下Windows 的子类化处理。 大家都知道,在 windows 里不管你做了什么事,都会向 windows 发送一条消息,然后由 Windows 作出相应的处理后才会返回给传送消息的应用程序。 那大家会问:“HOOK不是已经拦截了 windows 消息了吗?” 是啊,那也要看是拦截了什么消息,就如上面我们写的WH_KEYBOARD,我们拦截了键盘 消息,我们可以在按下任何一个按键的时候做出处理。消息的种类有很多。 可是我们今天要讲的是 windows 的子类化处理,这又是一门新的技术。 不废话了,这就开始。^_^ 相信大家都见过两这个 API:GetWindowsLong 和 SetWindowLong; 可能你们会说,这些不是处理窗口消息的吗?对,这就是我们要用到的API。 接下来让我们看一下这些 API 的参数。 LONG GetWindowLong( HWND hWnd, //窗体的句柄 int nIndex //欲取回的信息,可参照下表 ); nIndex的值可以是下列任何一个 GWL_EXSTYLE 扩展窗口样式 GWL_STYLE 窗口样式 GWL_WNDPROC 该窗口的窗口函数的地址 GWL_HINSTANC...