在DELPHI中HOOK程序的编写

时间:2010-02-05 17:12:24  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:就是HOOK程序。  ■ 使用DELPHI实现的HOOK程序  DELPHI作为一种可视化的开发工具以其程序开发的短周期和编译代码的高效率受到了广大程序人员的喜爱。一般来说,编写HOOK程序应将hook procedures函数编写为DLL,然后在主程序中调用。因此,编写HOOK程序需要调用API函数并将其编译为DLL(动态连接库),这两点在DELPHI中实现起来可以说是轻而易举。通过以下的...
  正文:在编写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;

// WH_KEYBOARD Hook Demo
// 1. Project | Compile 编译连结成 HKTest.DLL
// 2. 开启 HookDemo.DPR 测试
library HKTest;

uses
HKProc in 'HKProc.pas';

exports
EnableHotKeyHook,
DisableHotKeyHook;

begin
  hNextHookProc := 0;
  // 以下这两列, 旨在确定 DLL UnLoad 时, 确定将 HOOK 解除
   //To keep the exit chain intact,
   // you need to save the current contents of ExitProc before
   //changing it to the address of your own exit procedure.
   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: LPARAM): LRESULT; stdcall; export;
function EnableHotKeyHook: BOOL; export;
function DisableHotKeyHook: BOOL; export;
procedure HotKeyHookExit; far;

implementation

function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
_KeyPressMask = $80000000;
begin
  Result := 0;
  If iCode < 0 Then
  begin
    Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
    Exit;
  end;
  // 侦测 Ctrl + B 组合键
   if ((lParam and _KeyPressMask) = 0) and   //(lparam and $80000000= 0) -->down   <>0 --> up;
     (GetKeyState(vk_control) <0) and (wParam = Ord('B')) then
  begin
    Result := 1;
    WinExec('Notepad.exe', sw_Normal);   // 记事本
   end;
end;


function EnableHotKeyHook: BOOL; export;
begin
  Result := False;
  if hNextHookProc <> 0 then Exit;
  // 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下
   // 来, 免得 HOOK 呼叫链结断掉
   hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,
  KeyboardHookHandler,
  HInstance,
  0);
  Result := hNextHookProc <> 0;
end;


function DisableHotKeyHook: BOOL; export;
begin
  if hNextHookProc <> 0 then
  begin
    UnhookWindowshookEx(hNextHookProc);   // 解除 Keyboard Hook

在DELPHI中HOOK程序的编写》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/12788.html


关键字:

关于《在DELPHI中HOOK程序的编写》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td