钩子能够实现,但是只能响应调用程序的消息,下面是我的dll代码,是不是问题出在这里?
//----------------------------- 库工程 ----------------------------------
library MouseHook;uses
SysUtils,
Classes,
Code_MouseHookDll in 'Code_MouseHookDll.pas';{$R *.res}exports
//输出的函数
EnableMouseHook, //开启鼠标钩子
DisableMouseHook; //停止鼠标钩子beginend.//----------------------------- 库代码单元 -----------------------------
unit Code_MouseHookDll;interfaceuses
Windows, Messages, Dialogs, Classes;var
hMouseHook: HHOOK; //鼠标钩子句柄
RecordFile: string; //记录文件的完整路径文件名function EnableMouseHook(AFileName: string): boolean; stdcall; export;
//调用方式:导出,外部程序调用
//功能:开启鼠标钩子
//返回:开启是否成功function DisableMouseHook(): boolean; stdcall; export;
//调用方式:导出,外部程序调用
//功能:关闭鼠标钩子
//返回:是否成功function MouseHookProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM):
LRESULT; stdcall;
//调用方式:内部函数,由SetWindowsHookEx调用
//功能:鼠标钩子回调函数
//参数:nCode,Hook标志,1存在,0不存在;
// WParam,鼠标消息;
// LParam,鼠标信息结构;
//返回:如果不是0的话windows就把这个消息丢掉,其它的程序就不会再收到这个消息。implementation//------------------------------------------------------------------------------
function EnableMouseHook(AFileName: string): boolean; stdcall; export;
begin
RecordFile := AFileName;
if hMouseHook = 0 then //为了安全,必须判断一下再设置钩子。
begin
// 第三个参数的Hinstance 在Delphi中有定义,用就可以了。第四个参数必须为0
hMouseHook := SetWindowsHookEx(WH_MOUSE,@MouseHookProc,Hinstance,0);
AddToFile('Started!');
Result := True;
end
else
Result := False;
end;//------------------------------------------------------------------------------
function DisableMouseHook(): boolean; stdcall; export;
begin
if hMouseHook <> 0 then //如果有钩子就卸掉。
begin
UnHookWindowsHookEx(hMouseHook);
hMouseHook := 0;
AddToFile('Stopped');
Result := True;
end
else
Result := False;
end;//------------------------------------------------------------------------------
function MouseHookProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM):
LRESULT; stdcall;
begin
Result := 0;
if nCode < 0 then
//有其它的钩子,参数传给他。
//让函数CallNextHookEx调用下一个钩子
Result := CallNextHookEx(hMouseHook,nCode,WParam,LParam)
else if wParam = WM_LBUTTONDOWN then //判断鼠标是否单击
begin
//相应处理函数
end;
end;end.
//----------------------------- 库工程 ----------------------------------
library MouseHook;uses
SysUtils,
Classes,
Code_MouseHookDll in 'Code_MouseHookDll.pas';{$R *.res}exports
//输出的函数
EnableMouseHook, //开启鼠标钩子
DisableMouseHook; //停止鼠标钩子beginend.//----------------------------- 库代码单元 -----------------------------
unit Code_MouseHookDll;interfaceuses
Windows, Messages, Dialogs, Classes;var
hMouseHook: HHOOK; //鼠标钩子句柄
RecordFile: string; //记录文件的完整路径文件名function EnableMouseHook(AFileName: string): boolean; stdcall; export;
//调用方式:导出,外部程序调用
//功能:开启鼠标钩子
//返回:开启是否成功function DisableMouseHook(): boolean; stdcall; export;
//调用方式:导出,外部程序调用
//功能:关闭鼠标钩子
//返回:是否成功function MouseHookProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM):
LRESULT; stdcall;
//调用方式:内部函数,由SetWindowsHookEx调用
//功能:鼠标钩子回调函数
//参数:nCode,Hook标志,1存在,0不存在;
// WParam,鼠标消息;
// LParam,鼠标信息结构;
//返回:如果不是0的话windows就把这个消息丢掉,其它的程序就不会再收到这个消息。implementation//------------------------------------------------------------------------------
function EnableMouseHook(AFileName: string): boolean; stdcall; export;
begin
RecordFile := AFileName;
if hMouseHook = 0 then //为了安全,必须判断一下再设置钩子。
begin
// 第三个参数的Hinstance 在Delphi中有定义,用就可以了。第四个参数必须为0
hMouseHook := SetWindowsHookEx(WH_MOUSE,@MouseHookProc,Hinstance,0);
AddToFile('Started!');
Result := True;
end
else
Result := False;
end;//------------------------------------------------------------------------------
function DisableMouseHook(): boolean; stdcall; export;
begin
if hMouseHook <> 0 then //如果有钩子就卸掉。
begin
UnHookWindowsHookEx(hMouseHook);
hMouseHook := 0;
AddToFile('Stopped');
Result := True;
end
else
Result := False;
end;//------------------------------------------------------------------------------
function MouseHookProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM):
LRESULT; stdcall;
begin
Result := 0;
if nCode < 0 then
//有其它的钩子,参数传给他。
//让函数CallNextHookEx调用下一个钩子
Result := CallNextHookEx(hMouseHook,nCode,WParam,LParam)
else if wParam = WM_LBUTTONDOWN then //判断鼠标是否单击
begin
//相应处理函数
end;
end;end.
解决方案 »
- 菜单和树的动作如何关联?
- 为什么sqldirect查询速度差别这么大
- POS 客户显示屏上显示价格 只能在 原有显示后面加数据上去 怎样清屏 和 走马灯效果呢?
- 问个SQL问题
- Delphi中调用DLL问题
- 诚聘开发人员
- 关于fastreport问题,非常急,请大侠帮忙,不胜感激!(65分)
- access数据库如何定义能显视图片的字段?
- 用ADOQUERY 如何实现查找某条特定记录,记录指针指向这条记录,并返回某一字段的值?
- 当点击stringgrid中的一行时,怎样让该行字体的颜色变成想要的颜色?
- 天哪,真是邪了门!!EDIT中按回车怎么没响应?我真的快要疯了,UP有分。
- 非Delphi用户请教一个非常简单的数据库访问问题?来者有分!
----在程序初始化的时候,调用函数SetWindowsHookEx安装勾子。其函数原型为: HHOOK SetWindowsHookEx
( int idHook,HOOKPROC lpfn,
INSTANCE hMod,DWORD dwThreadId )----参数idHook表示勾子类型,它是和勾子函数类型一一对应的。比如,WH_KEYBOARD表示
安装的是键盘勾子,WH_MOUSE表示是鼠标勾子等等。 ----Lpfn是勾子函数的地址。 ----HMod是勾子函数所在的实例的句柄。对于线程勾子,该参数为NULL;对于系统勾子,该
参数为勾子函数所在的DLL句柄。 ---- dwThreadId 指定勾子所监视的线程的线程号。对于全局勾子,该参数为NULL。 ----SetWindowsHookEx返回所安装的勾子句柄。
2.将library MouseHook;中的
//begin
//end.
改成
begin
hMousehook:=0;
procsaveexit:=exitproc;//保存返回地址
exitproc:=@Mousehookexit;//退出处理
end.
3.Code_MouseHookDll.pas
//var
// hMouseHook: HHOOK;
改成
var
hMouseHook: HHOOK;
procsaveexit:pointer;//声明procsaveexit
增加
procedure Mousehookexit;
begin
if hMouseHook〈〉0 then
disablemousehook;
exitproc:=procsaveexit;//恢复
end;
费了我半天的时间
不过引出了另一个问题——怎么定义dll全局变量?static?
begin
//相应处理函数 end; if nCode < 0 then
begin
Result := CallNextHookEx(hMouseHook,nCode,WParam,LParam)
end