已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
钩子(HOOK)机制的使用 作者:e梦缘 SetwindowsHookEx函数提供13种不同的消息监视类型,也就是13中不同的钩子。 分别用于捕获某一特定类型或某一范围的消息(如:键盘消息,鼠标消息等)。 我们这里仅以鼠标钩子的使用为例,讨论在DELPHI下怎样编写DLL程序和怎样在自己的程序中安装使用鼠标钩子函数。 Windows提供API函数SetwindowsHookEx来建立一个Hook, 通过这个函数可以将一个程序添加到Hook链中监视Windows消息,函数语法为: SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD) 其中: 参数idHook指定建立的监视函数类型。 参数lpfn指定消息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处理。函数的一般形式为: Hookproc (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall; 其中code为系统指示标记,wParam和lParam为附加参数,根据不同的消息监视类型而不同。只要在程序中建立这样一个函数再通过SetwindowsHookEx函数将它加入到消息监视链中就可以处理消息了。 由于钩子过滤函数必须在独立的模块中,也就是说我们必须首先生成一个DLL框架,然后再在其中加入钩子函数代码以及其他相关函数代码。 一、 钩子编写说明 1、先生成一个DLL框架 2、编写自己的钩子过滤函数 钩子过滤函数必须是回调函数,其函数的形式: function KeyHookProc( iCode:Integer; wParam:WPARAM; lParam:LPARAM ) : LRESULT; stdcall ;export ; 3、在生成的DLL框架中加入自己钩子的处理函数。 4、用SetWindowsHookEx函数(用法见上)安装HOOK 5、用UnHookWindowsHookEx卸载钩子 library mousehook; uses SysUtils, Classes,Windows,messages,shellapi; type Tcallbackfun=procedure(info:pchar); Tmousehook=record isrun:boolean; hook:hhook; callbackfun:Tcallbackfun; end; var mymousehook:Tmousehook; $R *.res function gethookinfo(code:integer;wp:WPARAM;lp:LPARAM):LResult;stdcall; var info:string; begin if code0 then begin result:= CallNextHookEx(mymousehook.hook,code,wp,lp); exit; end; info:=; Case wp of WM_LBUTTONDOWN:begin info:=WM_LBUTTONDOWN+; end; WM_LBUTTONUP:begin info:=WM_LBUTTONUP+; end; WM_LBUTTONDBLCLK:begin info:=WM_LBUTTONDBLCLK+; end; WM_RBUTTONDOWN:begin info:=WM_RBUTTONDOWN+; end; WM_RBUTTONUP:begin info:=WM_RBUTTONUP+; end; WM_RBUTTONDBLCLK:begin info:=WM_RBUTTONDBLCLK+; end; WM_MBUTTONDOWN:begin info:=WM_MBUTTONDOWN+; end; WM_MBUTTONUP:begin info:=WM_MBUTTONUP+; end; WM_MBUTTONDBLCLK:begin info:=WM_MBUTTONDBLCLK+; end; WM_NCMouseMove, WM_MOUSEMOVE:begin info:=WM_MOUSEMOVE+; end; end; info:=info+pos(+inttostr(PMouseHookStruct(lp).pt.x)+,+inttostr(PMouseHookStruct(lp).pt.x)+) ; mymousehook.callbackfun(pchar(info); result:= CallNextHookEx(mymousehook.hook,code,wp,lp); end; procedure installmousehook(callbackF:Tcallbackfun); stdcall; begin if not mymousehook.isrun then begin mymousehook.hook:=setwindowshookex(WH_MOUSE,gethookinfo,HInstance,getcurrentthreadid(); mymousehook.callbackfun :=callbackf; mymousehook.isrun:=not mymousehook.isrun; end; end; procedure uninstallmousehook(); stdcall; begin if mymousehook.isrun then begin UnHookWindowsHookEx(mymousehook.hook); mymousehook.callbackfun :=nil; mymousehook.isrun:=not mymousehook.isrun; end; end; Procedure DLLEntryPoint(dwReason:DWord); begin Case dwReason of DLL_PROCESS_ATTACH:begin mymousehook.isrun:=false; end; DLL_PROCESS_DETACH:; DLL_THREAD_ATTACH:; DLL_THREAD_DETACH:; End; end; exports installmousehook, uninstallmousehook; begin DLLProc := DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. - 二、钩子的使用 1、调用钩子的DLL 2、安装钩子 3、一定不要忘了卸装钩子 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Tcallbackfun=procedure(info:pchar); type TForm1 = class(TForm) memo: TMemo; Button1: TButton; procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private Private declarations public Public declarations end; var Form1: TForm1; implementation procedure installmousehook(callbackF:Tcallbackfun); stdcall;external mousehook.dll; procedure uninstallmousehook(); stdcall;external mousehook.dll; $R *.dfm procedure addinfo(info:pchar); begin Tform1(application.MainForm ).memo.Lines.Add(info); end; /2、安装钩子 procedure TForm1.Button1Click(Sender: TObject); begin installmousehook(addinfo); end; /3、一定不要忘了卸装钩子 procedure TForm1.FormDestroy(Sender: TObject); begin uninstallmousehook(); end; end. 利用Hook技术实现键盘监控 乌鲁木齐军医学院 卢立建 - 在许多系统中,出于安全或其它原因,常常要求随时对键盘进行监控,一个专业的监控程序必须具备两点,一是实时;二是作为指示图标运行。实际应用中把利用Hook(即钩子)技术编写的应用程序添加到Windows的任务栏的指示区中就能够很好的达到这个目的。我在参考了API帮助文档基础上,根据在Delphi开发环境中的具体实现分别对这两部分进行详细论述。 一、Hook(钩子)的实现: - Hook是应用程序在Microsoft Windows 消息处理过程中设置的用来监控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现Hook的方式。 - 1新建一个导出两个函数的DLL文件,在hookproc.pas中定义了钩子具体实现过程。代码如下: library keyspy;useswindows, messages, hookproc in hookproc.pas;exportssetkeyhook,endkeyhook;beginnexthookproc:=0;procsaveexit:=exitproc;exitproc:=keyhookexit;end.2.在Hookproc.pas中实现了钩子具体过程:unit hookproc;interfaceusesWindows, Messages, SysUtils, Controls, StdCtrls;varnexthookproc:hhook;procsaveexit:pointer;function keyboardhook(icode:integer;wparam:wparam; lparam:lparam):lresult;stdcall;export;function setkeyhook:bool;export;/加载钩子function endkeyhook:bool;export;/卸载钩子procedure keyhookexit;far;constafilename=c:debug.txt;/将键盘输入动作写入文件中vardebugfile:textfile;implementationfunction keyboardhookhandler(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;export;beginif icode0 thenbeginresult:=callnexthookex(hnexthookproc,icode,wparam,lparam);exit;end;assignfile(debugfile,afilename);append(debugfile);if getkeystate(vk_return)0 thenbeginwriteln(debugfile,);write(debugfile,char(wparam);endelsewrite(debugfile,char(wparam);closefile(debugfile);result:=0;end;function endkeyhook:bool;export;beginif nexthookproc0 then beginunhookwindowshookex(nexthookproc);nexthookproc:=0;messagebeep(0); end;result:=hnexthookproc=0;end;procedure keyhookexit;far;beginif nexthookproc0 then endkeyhook;exitproc:=procsaveexit; end;end.- 二、Win95/98使用任务栏右方指示区来显示应用程序或工具图标对指示区图标的操作涉及了一个API函数Shell_NotifyIcon,它有两个参数,一个是指向TnotifyIconData结构的指针,另一个是要添加、删除、改动图标的标志。通过该函函数将应用程序的图标添加到指示区中,使其作为图标运行,增加专业特色。当程序起动后,用鼠标右键点击图标,则弹出一个菜单,可选择sethook或endhook。 unit kb;interfaceusesWindows, Messages, SysUtils, Classes,Graphics, Controls, Forms,Dialogs,StdCtrls, Menus,shellapi;consticon_id=1;MI_iconevent=wm_user+1;/定义一个用户消息typeTForm1 = class(TForm)PopupMenu1: TPopupMenu;sethook1: TMenuItem;endhook1: TMenuItem;N1: TMenuItem;About1: TMenuItem;Close1: TMenuItem;Gettext1: TMenuItem;procedure FormCreate(Sender: TObject);procedure sethook1Click(Sender: TObject);procedure endhook1Click(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure Close1Click(Sender: TObject);private Private declarations nid:tnotifyicondata;normalicon:ticon;public Public declarations procedure icontray(var msg:tmessage); message mi_iconevent;end;varForm1: TForm1;implementation$R *.DFMfunction setkeyhook:bool;external keyspy.dll;function endkeyhook:bool;external keyspy.dll;procedure tform1.icontray(var msg:tmessage);varpt:tpoint;beginif msg.lparam=wm_lbuttondown thensethook1click(self);if msg.LParam=wm_rbuttondown thenbegingetcursorpos(pt);setforegroundwindow(handle);popupmenu1.popup(pt.x,pt.y);end;end;procedure TForm1.FormCreate(Sender: TObject);beginnormalicon:=ticon.create;application.title:=caption;nid.cbsize:=sizeof(nid);nid.wnd:=handle;nid.uid:=icon_id;nid.uflags:=nif_icon or nif_message or nif_tip;nid.ucallbackmessage:=mi_iconevent;nid.hIcon :=normalicon.handle;strcopy(nid.sztip,pchar(caption);nid.uFlags:=nif_message or nif_icon or nif_tip;shell_notifyicon(nim_add,nid);SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);end;procedure TForm1.sethook1Click(Sender: TObject);beginsetkeyhook;end;procedure TForm1.endhook1Click(Sender: TObject);beginendkeyhook;end;procedure TForm1.FormDestroy(Sender: TObject);beginnid.uFlags :=0;shell_notifyicon(nim_delete,nid);end;procedure TForm1.Close1Click(Sender: TObject);beginapplication.terminate;end;- 该程序虽然只用了几个shellai函数,但是它涉及到了在Delphi中对DLL的引用、钩子实现、对指示区的操作、用户定义消息的处理、文件的读写等比较重要的内容,我相信这篇文章能对许多Delphi的初学者有所帮助。 - 该程序在Win98、Delphi4.0中正常运行。第二电脑网导读:就是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的源代码(我们假设需要捕捉CRTLN这一击键动作):选择FILE菜单中的NEW选项,选择产生一个新的DLL模板,存为HKTEST.DPRlibrary HKTest;/ WH_KEYBOARD Hook Demo/ 1. Project | Compile 编译连结成 HKTest.DLL/ 2. 开启 HookDemo.DPR 测试library HKTest;usesHKProc in HKProc.pas;exportsEnableHotKeyHook,DisableHotKeyHook;beginhNextHookProc := 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;interfaceusesWindows, Messages;varhNextHookProc: 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;implementationfunction KeyboardHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall; export;const_KeyPressMask = $80000000;beginResult := 0;If iCode down 0 - up; (GetKeyState(vk_control) 0) and (wParam = Ord(B) thenbeginResult := 1;Wi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云南省大理白族自治州2027年高三冲刺模拟物理试卷(含答案解析)
- 2026年消毒供应中心上半年工作总结
- 工程监理主管2026年二季度施工现场监理统筹总结
- 辖区危险水域安全警示宣讲课件
- 2026年秋季高三提前开学第一课 化学冲刺复习方法
- 2026年北师大版小学三年级英语上册Lesson8《Letters》说课教案
- 2026年北师大版三年级语文《滥竽充数》课时教案
- 心肌梗死的一般治疗
- 工地现场临时用地租赁协议 施工堆放场地合同
- 慢阻肺肺康复护理查房
- 2024版人教版初中语文九上名著《唐诗三百首》复习题
- GB/T 17623-2026绝缘油中溶解气体组分含量的气相色谱测定法
- 2026广东珠海市斗门区招聘公办中小学教师134人(编制)考试参考试题及答案解析
- 2026年中国时尚耳夹数据监测研究报告
- 广西壮族自治区梧州市2026年高三第一次模拟考试物理试卷(含答案解析)
- 2026广州医药集团有限公司春季校园招聘笔试历年典型考点题库附带答案详解
- 上海市二级注册建造师继续教育(建筑工程)考试题库
- (2025年)市场监管法律知识复习试题考前模拟测试题附答案
- 新疆建设工程消防设计审查、验收常见问题技术解析(2024年)
- pe管道顶管施工方案
- 《DLT 1231-2018电力系统稳定器整定试验导则》专题研究报告深度
评论
0/150
提交评论