• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

在DELPHI中HOOK程序的编写

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap