5.要想安装全局勾子,应当定义在DLL动态链接库中
完整代码
library myHook;
uses
System.SysUtils,
Inifiles,
System.Classes,
Messages, {消息 WM_LBUTTONDOWN 定义在 Messages 单元}
windows; {钩子函数都来自 Windows 单元}
{$R *.res}
var
hook:HHOOK;
function hookCallBack(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
var
me:CWPSTRUCT;//CallWndProc 缩写
begin
//處理
MessageBox(0,PCHAR(inttostr(wparam)),'提示',MB_OK);
Result:=CallNextHookEx(hook,nCode,wParam,lParam);
end;
function setHook:Boolean;stdcall;
begin
hook:=SetWindowsHookEx(WH_KEYBOARD,@hookCallBack,HInstance,0);
Result:=hook<>0;
end;
function deleteHook:boolean;stdcall;
begin
result:=UnhookWindowsHookEx(hook);
end;
{按 DLL 的要求输出函数}
exports
setHook name 'setHook',
deleteHook name 'deleteHook',
hookCallBack name 'hookCallBack';
begin
end.
6.调用DLL动态链接库中的函数来安装勾子
动态调用
先申明要调用的函数
1 type
2 TDLLFun = function: Boolean; stdcall;{定义和 DLL 中同样参数和返回值的的函数类型}
2)申明存储DLL句柄的变量和要调用函数的地址
1 var
2 h: HWND; {声明一个 DLL 句柄}
3 SetHook, DelHook: TDLLFun; {声明两个 TDLLFun 变量}
3)载入DLL文件,取得DLL中的函数地址,赋值给DelHook,和SetHook变量
procedure TForm5.Button1Click(Sender: TObject);
var
b:Boolean;
begin
h := LoadLibrary('myHook.dll'); {载入 DLL 并获取句柄}
if h<>0 then
begin
SetHook := GetProcAddress(h, 'setHook'); {让 SetHook 指向 DLL 中相应的函数}
DelHook := GetProcAddress(h, 'deleteHook'); {让 DelHook 指向 DLL 中相应的函数}
end else ShowMessage('Err');
b:=SetHook; {执行钩子建立函数, 这里的 SetHook 和它指向的函数是同名的, 也可以不同名}
end;
4)程序关闭时删除勾子,释放DLL资源
1 procedure TForm5.Button2Click(Sender: TObject);
2 begin
3 DelHook; {执行钩子释放函数}
4 FreeLibrary(h); {释放 DLL 资源}
5 end;
调用勾子的全部代码
unit Unit5;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm5 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form5: TForm5;
implementation
{$R *.dfm}
{要先要定义和 DLL 中同样参数和返回值的的函数类型}
type
TDLLFun = function: Boolean; stdcall;
{现在需要的 DLL 中的函数的格式都是这样, 定义一个就够了}
var
h: HWND; {声明一个 DLL 句柄}
SetHook, DelHook: TDLLFun; {声明两个 TDLLFun 变量}
procedure TForm5.Button1Click(Sender: TObject);
var
b:Boolean;
begin
h := LoadLibrary('myHook.dll'); {载入 DLL 并获取句柄}
if h<>0 then
begin
SetHook := GetProcAddress(h, 'setHook'); {让 SetHook 指向 DLL 中相应的函数}
DelHook := GetProcAddress(h, 'deleteHook'); {让 DelHook 指向 DLL 中相应的函数}
end else ShowMessage('Err');
b:=SetHook; {执行钩子建立函数, 这里的 SetHook 和它指向的函数是同名的, 也可以不同名}
end;
procedure TForm5.Button2Click(Sender: TObject);
begin
DelHook; {执行钩子释放函数}
FreeLibrary(h); {释放 DLL 资源}
end;
end.
来源:http://www.cnblogs.com/zhwx/archive/2012/05/16/2503844.html
Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号
执行时间: 0.034847974777222 seconds