谁有关于HOOK的教程 谁有关于HOOK的教程,要讲的详细,全面,要适合对编程有了一定了解,对HOOK技术搞不清楚的人用的各位给点资料吧。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 {钩子(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函数(用法见上)安装HOOK5、用UnHookWindowsHookEx卸载钩子}library mousehook;uses SysUtils, Classes,Windows,messages,shellapi;typeTcallbackfun=procedure(info:pchar);Tmousehook=recordisrun:boolean;hook:hhook;callbackfun:Tcallbackfun;end;varmymousehook:Tmousehook;{$R *.res}function gethookinfo(code:integer;wp:WPARAM;lp:LPARAM):LResult;stdcall;varinfo:string;beginif code<0 then beginresult:= CallNextHookEx(mymousehook.hook,code,wp,lp);exit;end;info:='';Case wp ofWM_LBUTTONDOWN:begininfo:='WM_LBUTTONDOWN+';end;WM_LBUTTONUP:begininfo:='WM_LBUTTONUP+';end;WM_LBUTTONDBLCLK:begininfo:='WM_LBUTTONDBLCLK+';end;WM_RBUTTONDOWN:begininfo:='WM_RBUTTONDOWN+';end;WM_RBUTTONUP:begininfo:='WM_RBUTTONUP+';end;WM_RBUTTONDBLCLK:begininfo:='WM_RBUTTONDBLCLK+';end;WM_MBUTTONDOWN:begininfo:='WM_MBUTTONDOWN+';end;WM_MBUTTONUP:begininfo:='WM_MBUTTONUP+';end;WM_MBUTTONDBLCLK:begininfo:='WM_MBUTTONDBLCLK+';end;WM_NCMouseMove, WM_MOUSEMOVE:begininfo:='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;beginif not mymousehook.isrun thenbeginmymousehook.hook:=setwindowshookex(WH_MOUSE,@gethookinfo,HInstance,getcurrentthreadid());mymousehook.callbackfun :=callbackf;mymousehook.isrun:=not mymousehook.isrun;end;end;procedure uninstallmousehook(); stdcall;beginif mymousehook.isrun thenbeginUnHookWindowsHookEx(mymousehook.hook);mymousehook.callbackfun :=nil;mymousehook.isrun:=not mymousehook.isrun;end;end;Procedure DLLEntryPoint(dwReason:DWord); beginCase dwReason ofDLL_PROCESS_ATTACH:beginmymousehook.isrun:=false;end;DLL_PROCESS_DETACH:;DLL_THREAD_ATTACH:;DLL_THREAD_DETACH:;End;end;exportsinstallmousehook,uninstallmousehook;beginDLLProc := @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. 怎么判断sql用户连接数 关于DateTimePicker与查询的问题 “Delphi梦魇” 你们中了么? 关于加密解密的一个问题 怎样限定长度读取字符? 小弟有礼了,问个弱智问题“奇怪,表ID值居然始终为0。是怎么回事?” 问题简单 -- 分多 如何列举ODBC中所有的数据源(DSN) 高难度问题要请高手解决!而且分数也高!还可以再加! 谁知道DELPHI5补丁1的注册码?谢谢 请教个简单的问题!看看大家有没有更好的意见!! 如何使自己的程序不出现在任务栏中?
钩子(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 code<0 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
beginmymousehook.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;interfaceuses
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.