Welcome

首页 / 软件开发 / Delphi / 使用钩子函数[3] - 建立一个全局的鼠标钩子

使用钩子函数[3] - 建立一个全局的鼠标钩子2009-12-10 博客园 万一分两步:

一、建立 DLL, 并在 DLL 实现钩子的设置、释放和钩子函数;

二、再建一个工程调用测试.

第一步: 做 DLL

先建立一个 DLL 工程, 自动初始的代码如下(去掉注释了):

library Project1;

uses
SysUtils,
Classes;

{$R *.res}

begin
end.


//把工程保存为 MyHook.dpr, 并实现如下:

library MyHook;

uses
SysUtils,
Windows, {钩子函数都来自 Windows 单元}
Messages, {消息 WM_LBUTTONDOWN 定义在 Messages 单元}
Classes;

{$R *.res}

var
hook: HHOOK; {钩子变量}

{钩子函数, 鼠标消息太多(譬如鼠标移动), 必须要有选择, 这里选择了鼠标左键按下}
function MouseHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
if wParam = WM_LBUTTONDOWN then
begin
MessageBeep(0);
end;
Result := CallNextHookEx(hook, nCode, wParam, lParam);
end;

{建立钩子}
function SetHook: Boolean; stdcall;
begin
hook := SetWindowsHookEx(WH_MOUSE, @MouseHook, HInstance, 0);
Result := hook <> 0;
end;

{释放钩子}
function DelHook: Boolean; stdcall;
begin
Result := UnhookWindowsHookEx(hook);
end;

{按 DLL 的要求输出函数}
exports
SetHook name "SetHook",
DelHook name "DelHook",
MouseHook name "MouseHook";

//SetHook, DelHook, MouseHook; {如果不需要改名, 可以直接这样 exports}

begin
end.

注意: SetWindowsHookEx 的第一个参数 WH_MOUSE 说明这是个鼠标钩子; 第四个参数 0 说明是全局的.

鼠标钩子回调函数的格式在这里:www.cnblogs.com/del/archive/2008/02/25/1080724.html

然后按 Ctrl+F9 编译, 在工程目录下会生成一个和工程同名的文件, 这里是: MyHook.dll.