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 ;pMousePointMouseHookStruct;
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个人的程序,都存在钩子不是全局这个问题
谢谢各位大侠
居然不管用。
小弟的代码如下:
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 ;pMousePointMouseHookStruct;
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个人的程序,都存在钩子不是全局这个问题
谢谢各位大侠