哪位大侠可以给我一个鼠标钩子的例子(200分)

  • 主题发起人 主题发起人 xueminliu
  • 开始时间 开始时间
X

xueminliu

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟急需做一个全局鼠标的监控程序,一年以前我自己做了一个键盘钩子,但是改成鼠标后
居然不管用。
小弟的代码如下:
Library MouseHook;
uses
; Messages,
; Windows;

const WM_MOUSEHOOK = WM_USER+16; ;//自己定义的消息,通过消息方式和主程序通讯

var
; hOldMouseHook : HHook; ; ;//钩子
; ProcSaveExit : Pointer;
; hHandle : integer; ;//主函数窗口句柄,用以处理消息

function MouseHookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;stdcall;export;
var ;pMousePoint:PMouseHookStruct;
begin
; if iCode < 0 then
; ; Result := CallNextHookEx(hOldMouseHook, iCode, wParam, lParam)
; else begin
; ; ; if (wParam=WM_MOUSEMOVE) then ;begin ; ;//只处理鼠标移动消息
; ; ; ; pMousePoint := PMouseHookStruct(LPARAM);
; ; ; ; PostMessage(hHandle,WM_MOUSEHOOK,pMousePoint^.pt.X,pMousePoint^.pt.Y); ; //把坐标传过去
; ; ; end;
; ; ; iCode:=-1;
; ; ; Result := CallNextHookEx(hOldMouseHook, iCode, wParam, lParam); ; ;//调用下一个函数
; end;
end;

// 设置钩子过滤函数
function EnableMouseHook(hd:Integer) : BOOL ; export;
var hinst:thandle; ; ;{该动态连接库自己的模块局柄}
; ; proc:tfarproc; ; ;{鼠标钩子函数mouseProc的地址}
begin
; hHandle := hd;
; if hOldMouseHook=0 then begin
; ; hinst:=getModuleHandle('MouseHook.dll');
; ;{得到mousedll.dll的模块局柄,即该动态连接库自己的模块局柄}
; ; proc:=getProcAddress(hinst,'MouseHookProc');

; ; hOldMouseHook := setWindowsHookEx(WH_MOUSE,proc,hinst,0); ;//设置钩子函数
; ; //开始用的代码是hOldMouseHook := setWindowsHookEx(WH_MOUSE,'MouseHookProc',hInstance,0);
; end;
; Result := (hOldMouseHook <> 0);
end;

//撤消钩子过滤函数
function DisableMouseHook: BOOL ; export;
begin
; if hOldMouseHook<> 0 then begin
; ; UnHookWindowsHookEx(hOldMouseHook); // 解除 Keyboard Hook
; ; hOldMouseHook:= 0;
; end;
; Result := (hOldMouseHook = 0);
end;

//DLL的退出处理过程
procedure MouseHookExit; far;
begin
; if hOldMouseHook <> 0 then DisableMouseHook;
; ExitProc := ProcSaveExit;
end;

exports // 定义输出函数
MouseHookProc,
EnableMouseHook,
DisableMouseHook;

begin
; ProcSaveExit := ExitProc; // 保存DLL的ExitProc
; ExitProc := @MouseHookExit; // 设置DLL新的ExitProc
end.

存在的问题是这个dll只能在一个程序中使用,一旦鼠标移出主程序的窗口钩子就不管用,
移进去后又管用.

即我需要的是一个全局钩子,我下载了mafeitao提供的代码,但是一旦移植到32位下就不行了
还有我使用的是win2000,我改造了n个人的程序,都存在钩子不是全局这个问题
谢谢各位大侠
 
看看这个呢
http://www.delphibbs.com/delphibbs/dispq.asp?lid=635375
 
给地址,我给你发一个可以记录鼠标键盘操作并能回放的程序。
 
谢谢,顺便给我一个。
boyface@263.net
 
我的Email是xueminliu@163.com
谢谢大侠
 
tanglu大侠:
; 那个帖子我知道,而且我也试过,对键盘的确没有问题,但是对鼠标钩子无法成为全局钩子.
只能记录本进程的鼠标消息
 
已发
不知是否可以达到你的目的?
 
谢谢各位大侠,小弟那个问题已经解决了,为此我痛苦了4天
原来错误发生在下面:

hHandle : integer; ;//主函数窗口句柄,用以处理消息

function MouseHookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;stdcall;export;
var ;pMousePoint:PMouseHookStruct;
begin
; if iCode < 0 then
; ; Result := CallNextHookEx(hOldMouseHook, iCode, wParam, lParam)
; else begin
; ; ; if (wParam=WM_MOUSEMOVE) then ;begin ; ;//只处理鼠标移动消息
; ; ; ; pMousePoint := PMouseHookStruct(LPARAM);
; ; ; ; PostMessage(hHandle,WM_MOUSEHOOK,pMousePoint^.pt.X,pMousePoint^.pt.Y); ; //把坐标传过去
***********************注意这里
hHandle是一个全局变量,但是dll可以被n个程序调用,因此不能使用全局变量
当鼠标落在主程序的窗口时这个值是我的入口函数传进去的值,如果鼠标不在主程序
窗口中这个值=0,具体原因大家可以看有关windows dll的知识
解决方法是把hHandle声名为内存映射文件,然后转化为共享变量,这样在dll中这个值是唯一的
因此消息就可以发过去了

谢谢各位大侠

; ; ;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部