转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
钩子(HOOK)机制的使用         ★★★★

钩子(HOOK)机制的使用

作者:闵涛 文章来源:闵涛的学习笔记 点击数:786 更新时间:2009/4/23 18:31:40
钩子(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 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
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.

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


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台