譬如我们用鼠标在某个窗口上双击了一次, 或者给某个窗口输入了一个字母 A;
首先发现这些事件的不是窗口, 而是系统!
钩子分两种: 系统级的全局钩子
线程级的钩子.
钩子使用到的函数有三个:
设置钩子: 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 种选择,我了解还少,就不说了,你们可以参考别的资料
posted on 2008-11-12 17:26
小叶子 阅读(973)
评论(0) 编辑 收藏 引用 所属分类:
delphi使用钩子函数