在DELPHI中HOOK程序的编写

在DELPHI中HOOK程序的编写在编写WINDOWS应用程序的时候,有时候我们希望所编写的程序可以捕获用户的某一个特定的动作(比如是否按下鼠标右键)。如果我们的程序处于系统前台,实现这一功能并不复杂。但如果程序在后台运行或者程序不是当前运行的进程的话,这一功能应该如何实现呢?答案就是HOOK程序。  ■ 使用DELPHI实现的HOOK程序  DELPHI作为一种可视化的开发工具以其程序开发的短周期和编译代码的高效率受到了广大程序人员的喜爱。一般来说,编写HOOK程序应将hook procedures函数编写为DLL ,然后在主程序中调用。因此,编写HOOK程序需要调用API函数并将其编译为DLL(动态连接库),这两点在DELPHI中实现起来可以说是轻而易举。通过以下的小例子你可以看到在DELPHI中实现HOOK程序是多么的简单。  首先是DLL的源代码(我们假设需要捕捉CRTL+N这一击键动作):  选择FILE菜单中的NEW选项,选择产生一个新的DLL模板,存为HKTEST.DPR library HKTest;   uses   HKProc in ′HKProc.pas′;// hook procedures函数在这个文件中定义  exports   EnableHotKeyHook,    DisableHotKeyHook;   //输出两个函数,保证在其他程序中可以调用这个DLL   begin    hNextHookProc := 0;    //以下这两条保证在DLL释放时解除HOOK    procSaveExit := ExitProc;    ExitProc := @HotKeyHookExit;   end.   以下是文件HKPROC.PAS的源码  unit HKProc;   interface   uses    Windows, Messages;   var    hNextHookProc: HHook;    procSaveExit: Pointer;   function KeyboardHookHandler(iCode: Integer; wParam: WPARAM; lParam: LPA RAM): LRESULT; stdcall; export;   function EnableHotKeyHook: BOOL; export;//使HOOK生效  function DisableHotKeyHook: BOOL; export;//使HOOK失效  procedure HotKeyHookExit; far;//   implementation   function KeyboardHookHandler(iCode: Integer; wParam: WPARAM; lParam: LPA RAM): LRESULT; stdcall; export;   const    —KeyPressMask = $80000000;   begin    Result := 0;    If iCode < 0 Then    begin    Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);    Exit;    end;   //捕捉CRTL+N    if ((lParam and —KeyPressMask) = 0) and (GetKeyState(vk—Control) < 0) and (wParam = Ord(′N′)) then    begin    Result := 1;    WinExec(′Notepad.exe′, sw—Normal);//每当用户按下CRTL+N时运行记事本程序 end;   end;   function EnableHotKeyHook: BOOL; export;   begin    Result := False;    if hNextHookProc <> 0 then Exit; // 连接到WH—KEYBOARD HOOK链,以捕捉击键动作。同时保留传回值以免HOOK链中断   hNextHookProc := SetWindowsHookEx(WH—KEYBOARD, KeyboardHookHandler, HI nstance, 0);    Result := hNextHookProc <> 0;   end;   function DisableHotKeyHook: BOOL; export;   begin    if hNextHookProc <> 0 then    begin    UnhookWindowshookEx(hNextHookProc); //解除 Keyboard Hook   hNextHookProc := 0;    MessageBeep(0);   MessageBeep(0);    end;    Result := hNextHookProc = 0;   end;   procedure HotKeyHookExit;   begin    // 如果忘了解除HOOK,自动代理解除HOOK    if hNextHookProc <> 0 then DisableHotKeyHook;    ExitProc := procSaveExit;   end;   end.