在DELPHI中HOOK程序的编写

减小字体 增大字体 作者:佚名  来源:转载  发布时间:2011-02-15 13:45:14

在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.

Tags:

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

广告位置B