钩子(HOOK)机制的使用

2016-02-19 12:46 115 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享钩子(HOOK)机制的使用吧。

【 tulaoshi.com - 编程语言 】

钩子(HOOK)机制的使用
  
  作者:e梦缘
  
  SetwindowsHookEx函数提供15种不同的消息监视类型,也就是15中不同的钩子。
  分别用于捕获某一特定类型或某一范围的消息(如:键盘消息,鼠标消息等)。
  我们这里仅以鼠标钩子的使用为例,讨论在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、调用钩子的DLL2、安装钩子3、一定不要忘了卸装钩子}unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;typeTcallbackfun=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;implementationprocedure installmousehook(callbackF:Tcallbackfun);  stdcall;external 'mousehook.dll';procedure uninstallmousehook();  stdcall;external 'mousehook.dll';{$R *.dfm}procedure addinfo(info:pchar);beginTform1(application.MainForm ).memo.Lines.Add(info);end;//2、安装钩子procedure TForm1.Button1Click(Sender: TObject);begininstallmousehook(addinfo);end;//3、一定不要忘了卸装钩子procedure TForm1.FormDestroy(Sender: TObject);beginuninstallmousehook();end;end.

  

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  风花雪月 e梦情缘
  网络代号:wnhoo or sos_admin
  网名:e梦缘
  Mail:wnhoo@163.com

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1601875.html

延伸阅读
机制馒头 馒头,又称之为馍、馍馍(仅限于晋语、闽方言有此称呼,馍字是后造字,有人认为馍字来源于馒字在早先晋语的读音。关中、中原等地称之为馍),中国传统面食,以面粉和水发酵后蒸制而成,外形通常是半球形、长方体,大小从直径4厘米左右到直径15厘米左右均有。中国北方传统上以馒头(华北、东北、西北...小编想用一道美食跟各位吃货们教个朋友噢!...
  帖个HOOK鼠标滚轮滚动的DLL。(我很菜,大家板砖少点,谢谢合作!!) //==================================== library hookprj; uses   SysUtils,   Classes,   Unit1 in 'Unit1.pas'; exports EnableMsgHook,  //只要把这两个函数输出就可以了, Disable...
、衔接 胎头双顶径进入骨盆入口平面,胎头颅骨最低点接近或达到坐骨棘水平,称为衔接(入盆)。胎头以半俯屈状态以枕额径进入骨盆入口,由于枕额径大于骨盆入口前后径,胎头矢状缝坐落在骨盆入口右斜径上,胎头枕骨在骨盆左前方。经产妇多在分娩开始后胎头衔接,部分初产妇在预产期前~2周内胎头衔接。 2 2、下降 是胎儿娩出的...
最近研究怎么样使用HOOK拦截其他应用程序的消息,于是就动手写了一个钩子程序来挂到最常用的通讯及时通讯工具MSN,虽然没有什么实际意义,但作为学习研究却能够帮助我们理解利用HOOK是怎么样将自己编写的DLL注入已经存在的程序空间中的。 !-- frame contents -- !-- /frame contents -- 我们需要做的是通过我们自己编写的应用程序...
本文详细介绍了SQL Server对XML支持,其中增强的特性,全新的面向XML的存储体系,SQL Server认证机制的安全性改进,分级的数据库访问实体机制,借助CLR控制.Net Assembly的执行过程,上下文定义特性等。 Internet:我用最XML的方式支持你 SQL Server对XML支持 Internet平台应用除了通信部分与其他应用有本质区别外,作为基...

经验教程

802

收藏

85
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部