当前位置:主页>仓库管理软件> 列表

请高手指教我的 Mouse Hook 代码 找会计

库存管理软件版1楼: 最近研究Mouse HOOK,下面是一个判断鼠标中键单击的小程序(代码经过删减),但是测试时发现只有在主窗口内部单击才会响应,请教各位高手如何响应在外部单击鼠标中键的事件?

代码如下:
DLL工程:
library MouseHook;


uses
HookUnit in ''HookUnit.pas'';

{$R *.res}

exports
EnableClickHook,
DisableClickHook;
begin
mymousehook.hook := 0;
procSaveExit := ExitProc;
ExitProc := @MouseHookExit;
end.

DLL单元:
unit HookUnit;

interface

uses
SysUtils,Classes,Windows,messages,shellapi;

type
Tcallbackfun=procedure(isclick:boolean);
Tmousehook=record
hook:hhook;
callbackfun:Tcallbackfun;
end;

var
procSaveExit: Pointer;
mymousehook:Tmousehook;
function ClickHook(iCode: Integer;wParam:WPARAM;lParam: LPARAM):LRESULT; stdcall; export;
function EnableClickHook(callbackF:Tcallbackfun): BOOL; export;
function DisableClickHook: BOOL; export;
procedure MouseHookExit; far;

implementation

function ClickHook(iCode: Integer;wParam:WPARAM;lParam: LPARAM):LRESULT; stdcall; export;
var
isclick:boolean;
begin
Result:=0;
isclick:=false;
If iCode < 0 Then
begin
Result:=CallNextHookEx(mymousehook.hook, iCode, wParam, lParam);
Exit;
end;
if (wParam=WM_MBUTTONDOWN) or (wParam=WM_NCMBUTTONDOWN) then
begin
isclick:=true;
mymousehook.callbackfun(isclick);
Result:=1;
Exit;
end;
end;

function EnableClickHook(callbackF:Tcallbackfun): BOOL; export;
begin
Result := False;
if mymousehook.hook<>0 then Exit;
mymousehook.hook:=SetWindowsHookEx(WH_Mouse,ClickHook,HInstance,0);
mymousehook.callbackfun:=callbackf;
Result:=mymousehook.hook <> 0;
end;

function DisableClickHook: BOOL; export;
begin
if mymousehook.hook<>0 then
begin
UnhookWindowshookEx(mymousehook.hook);
mymousehook.hook:=0;
end;
Result:=mymousehook.hook=0;
end;

procedure MouseHookExit;
begin
if mymousehook.hook<>0 then
begin
DisableClickHook;
end;
ExitProc:=procSaveExit;
end;
end.

主程序代码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;

type
Tcallbackfun=procedure(isclick:boolean);

type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function EnableClickHook(callbackF:Tcallbackfun): BOOL; external ''MouseHook.DLL'';
function DisableClickHook: BOOL; external''MouseHook.DLL'';

procedure MidKeyClick(isclick:boolean);
begin
if isclick then Form1.ProgressBar1.position:=Form1.ProgressBar1.position+5;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
EnableClickHook(MidKeyClick);end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DisableClickHook;
end;

end.

2楼: 如何响应在外部单击鼠标中键的事件?
须要做个DLL系统鼠标钩子,我一会回来再看你的代码,go food 如财务管理

3楼: WM_NCHITTEST, wParam(包含你要的信息)
此消息优先级最高

4楼: uiit 兄,可以说详细点吗?

5楼: 此消息,是非显示区命中测试
lParam含有鼠标坐标信息,拦截它,你就可以处理你的事情了萨

6楼: 用回调函数只能这样,实现不了你的要求。
当一个DLL被多个进程调用时,每个进程都会获得该DLL的一份映像。

库存管理软件版7楼: 回复uiit兄,我是要监听鼠标中键的点击事件啊,照你说得应该怎么改动代码?
回复 zbird 兄,那要如何才能监听鼠标中键的事件?

8楼: 用CreateFileMapping
内存映像共享你的鼠标信息.

9楼: ff_ff 兄,具体一点,我初学hook

10楼: 我也是新手,学HOOK,心有力而力不足.我也问过HOOK的问题,总是得不到答案.

11楼: case WM_NCHITTEST:
return (LRESULT) HTCLIENT ;
就把消息传回显示区了

12楼: 然后呢? 如会计

13楼: hook有些微妙的差别,多做些试验你就会发现问题出现在什么地方了,但想大彻大悟仍是一件困难的事啊!

库存管理软件版14楼: 我尝试不使用WH_MOUSE,而使用WH_JOURNALRECORD来监听鼠标的动作,代码如下:
function MouseHook(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
var
mouseevent:EVENTMSG;
begin
if iCode = HC_ACTION then
begin
mouseevent:=pEventMSG(lParam)^;
if mouseevent.message=WM_MBUTTONUP then 我的事件处理函数;
end;
Result:= CallNextHookEx(MouseHandle,iCode,wParam,lParam);
end;

可以实现监听并且响应我的事件处理函数,可是运行后马上或者隔一段时间过后鼠标左键就不能进行选取和点击了,而且键盘按键也失灵了,这是为什么?我并没有对鼠标和键盘进行操作阿。

15楼: Library MouseHookDll;
uses
SysUtils,
Classes,
WinTypes,
WinProcs,
Messages;
var
HMH:THandle;
IsHook:Boolean;
DestTopWin:HWnd;
function MouseHookPro(nCode:integer;wParam:WParam;lparam:LParam):Lresult;stdcall;
begin
if wParam=WM_LBUTTONDOWN THEN
MESSAGEBEEP(0);
Result := CallNextHookEx(HMH, nCode, wParam, lParam);
end;

function startHook():boolean;stdcall;
begin
result:=false;
if (isHook=true) then exit;
DestTopWin:=GetDeskTopWindow();
HMH:=SetWindowsHookEx(WH_MOUSE, MouseHookPro,HInstance, 0);
isHook:=HMH<>0;
Result:=isHook;

end;
function stopHook():boolean;stdcall;
begin
result:=false;
if (not isHook)and(HMH<>0) then
Result := UnhookWindowsHookEx(HMH);
isHook:=false;
end;
exports
startHook,
stopHook;


end.

unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;


implementation

{$R *.dfm}
function startHook:boolean;external ''MouseHookDll.dll'' name ''startHook'';
function stopHook:Integer;external ''MouseHookDll.dll'';
procedure TForm1.Button1Click(Sender: TObject);
begin
if StartHook then
ShowMessage(''Global Mouse Hook Set, Click on Desktop'')
else
ShowMessage(''Global Mouse Hook Not Set'');
end;

end.

我的QQ258268936,我也在学HOOK,一块交流