现在的位置: 首页 > 综合 > 正文

钩子1(线程级的钩子)

2013年10月09日 ⁄ 综合 ⁄ 共 1446字 ⁄ 字号 评论关闭

钩子分两种: 系统级的全局钩子   
                         线程级的钩子.
钩子使用到的函数有三个:
设置钩子: SetWindowsHookEx
释放钩子: UnhookWindowsHookEx
继续钩子: CallNextHookEx

下面是一个例子:(按字母A就会发出'咚,咚'的声音,测试请打开音箱)
在窗体上加上两个button组件
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
//在程序内部定义钩子函数
var
hok:hhook;
function keyb(ncode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;
 begin
 if wparam=65 then beep;//按A发声
 result:=callnexthookex(hok,ncode,wparam,lparam);
 end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 hok:=setwindowshookex(wh_keyboard,@keyb,0,getcurrentthreadid);//安装钩子
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
unhookwindowshookex(hok);//卸载钩子
end;

end.
函数讲解
setwindowshookex(
            idHook: Integer;钩子类型
            lpfn:TFNHookProc;函数指针,加@就可以
            hmod: HINST;包含钩子函数的模块(EXE、DLL)的句柄
            dwThreadId: DWORD ;关联线程,不是过进程
       )
参数四 dwThreadId : 在设置全局钩子时这个参数一般是 0, 表示关联所有线程; 本例是线程级                      的钩子, 所以是GetCurrentThreadId.
    getcurrentthreadid函数是获取当前进程一个唯一的标识符
    GetCurrentThreadId获取当前线程一个唯一的线程标识符

参数三 hmod: 是模块实例的句柄, 在 EXE 和 DLL 中都可以用 HInstance 得到当前实例的句柄; 直接用 API 也可以: GetModuleHandle(nil).
    handle,句柄,说明了变量的性质  而HInstance指的是对象的实例 

参数二   用@或addr()加函数名就可以

参数一  钩子类型, 共有 14 种选择

抱歉!评论已关闭.