procedure leftbuttondown(var msg:TMessage);message WM_LBUTTONDOWN;
procedure leftbuttonup(var msg:TMessage) message WM_LBUTTONUP;
截取这两下消息就可以了
procedure leftbuttonup(var msg:TMessage) message WM_LBUTTONUP;
截取这两下消息就可以了
按stiwin(战无不胜)的方法只能截取自己程序的鼠标
按erp2(天涯劍)的说法只能发出鼠标动作,而没有办法截取鼠标状态
可以通过wParam来判断鼠标的动作
为什么我设置的Hook没法捕获所有的Mouse事件呢,
只能得到在自己程序上的。
并没有hook所有进程
要捕获所有事件,得把你的hook程序放入dll中!
下面是Dll中的程序
exports
SetMouseHook,EndMouseHook;begin
HookHandle:=0;
ProcSaveExit:=ExitProc;
ExitProc:=@MouseHookExit;
end.var
HookHandle:hHook;
ProcSaveExit:Pointer;function SetMouseHook(AFileName:string):bool;export;
function EndMouseHook():bool;export;
procedure MouseHookExit;far;implementation
var
CurWindowHandle:HWND;
//LastWindowHandle:HWND;
MouseFile:TextFile;
FileName:string;
function Play(Code:integer;wParam,lParam:Longint):Longint;stdcall;//回调函数
var
xPos,yPos:integer;
x:TPoint;
begin
if Code>=0 then
begin
if wParam=WM_LBUTTONDOWN then
begin
x:=PMouseHookStruct(lParam).pt;
CurWindowHandle:=PMouseHookStruct(lParam).hwnd;
xPos:=x.x;
yPos:=x.y;
Writeln(MouseFile,IntToStr(xPos)+' '+IntToStr(yPos)+' '+IntToStr(CurWindowHandle));
end;
Result:=0;
end
else
Result:=CallNextHookEx(HookHandle,Code,wParam,lParam);
end;function SetMouseHook(AFileName:string):bool;
begin
HookHandle:=SetWindowsHookEx(WH_MOUSE,Play,hInstance,0);
FileName:='E:\1.txt';
AssignFile(MouseFile,FileName);
Rewrite(MouseFile);
Result:=(HookHandle<>0);
end;function EndMouseHook():bool;
begin
if HookHandle<>0 then
begin
UnHookWindowsHookEx(HookHandle);
HookHandle:=0;
end;
CloseFile(MouseFile);
Result:=(HookHandle=0);
end;procedure MouseHookExit;far;
begin
if HookHandle<>0 then
EndMouseHook;
//CloseFile(MouseFile);
ExitProc:=ProcSaveExit;
end;
end.
下面是调用Dll的程序
function SetMouseHook(AFileName:string):bool;external 'Mouse_Track.dll';
function EndMouseHook:bool;external 'Mouse_Track.dll';{$R *.DFM}procedure TForm1.BitBtn1Click(Sender: TObject);
begin
SetMouseHook('E:\1.txt');;
end;procedure TForm1.BitBtn2Click(Sender: TObject);
begin
EndMouseHook;
end;
begin
HookHandle:=SetWindowsHookEx(WH_MOUSE,Play,hInstance,0);
FileName:='E:\1.txt';
AssignFile(MouseFile,FileName);
Rewrite(MouseFile);
Result:=(HookHandle<>0);
end;FileName:='E:\1.txt';<-------------对FileName进行内存共享,否则其他程序执行Play钩子过程的时候FileName被初始化为空串,所以就表现为在其他程序中“为什么放在Dll中仍然只能捕获调用Dll的程序”。
当进行内存共享的时候,所有的程序都会使用同一个FileName内存变量。所以问题也就可以解决了。 我想飞,但是我是只笨鸟。
1、createfilemapping
2、MapViewOfFile
3、UnMapViewOfFile
4、CloseHandle
句我所知:WH_MOUSE_LL是win2k才支持的,WH_KEYBOARD_LL也是如此