mousep.PAS
资源名称:mousHook.zip [点击查看]
上传用户:yhtxzxm
上传日期:2007-01-04
资源大小:169k
文件大小:3k
源码类别:
钩子与API截获
开发平台:
Delphi
- unit Mousep;
- interface
- uses
- SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Forms, Dialogs, StdCtrls;
- {在DLL中也可有FORM型的变量}
- type
- TForm1 = class(TForm)
- Label1: TLabel; {显示wParam}
- Label2: TLabel; {显示lParam}
- Label3: TLabel; {显示x,y}
- Label4: TLabel; {显示hwnd}
- Label5: TLabel; {显示window text}
- Label6: TLabel;
- Label7: TLabel; {显示window class}
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- function sethook:bool;export;
- function unhook:bool;export;
- function mouseProc(code:integer;w:integer;l:longint):bool;export;
- var
- Form1: TForm1;
- idhook:longint;
- formok:bool;
- implementation
- {*********************************************************************
- 声明安装函数setWindowsHookEx(),
- 在Delphi中如果用函数setWindowsHook()则不需声明。
- 微软说函数setWindowsHook已在Windows3.1中废弃,为与Windows3.0兼容仍保留。
- 实际上该函数setWindowsHook在Windows3.1和Windows95中仍可使用。
- {*********************************************************************}
- function setwindowsHookEx(id:integer;proc:tfarproc;hinst,htask:thandle):
- longint;far;external 'user';
- {$R *.DFM}
- {安装鼠标钩子函数mouseProc}
- function sethook:bool;
- var
- hinst:thandle; {该动态连接库自己的模块局柄}
- proc:tfarproc; {鼠标钩子函数mouseProc的地址}
- begin
- {在动态连接库中创建form1}
- if formok=false then form1:=tform1.create(application) else exit;
- formok:=true;{安装form1 后,设置formok,不许再安装form1}
- {动态连接库的application指:调用动态连接库的主程序}
- form1.show;
- {不让用系统菜单来双击关闭Form1}
- form1.BorderIcons:=form1.BorderIcons-[biSystemMenu];
- hinst:=getModuleHandle('mousedll');
- {得到mousedll.dll的模块局柄,即该动态连接库自己的模块局柄}
- proc:=getProcAddress(hinst,'mouseProc');
- idhook:=setWindowsHookEx(WH_MOUSE,proc,hinst,0);
- {用WH_MOUSE参数安装鼠标钩子后,移动鼠标时,系统自动调用mouseProc钩子}
- if idhook =0 then sethook:=false else sethook:=true;
- end;
- {解除鼠标钩子函数mouseProc的安装}
- function unhook:bool;
- begin
- if formok=true then form1.free else exit; {检查form1是否已经关闭}
- formok:=false;{关闭了form1,设置formok=0}
- if idhook=0 then exit;
- unhookWindowsHookEx(idhook);
- unhook:=true;
- end;
- {mouseProc不由应用程序调用,而是在鼠标移动后,由系统调用}
- function mouseProc(code:integer;w:integer;l:longint):bool;
- var
- p:^TMouseHookStruct;
- poff:word;
- pseg:word;
- pmemo:pchar;
- begin
- if code<0 then begin
- mouseProc:=true;
- CallNextHookEx(idhook,0,w,l);
- end;
- if code=HC_NOREMOVE then form1.caption:='HC_NOREMOVE';
- form1.caption:='mouse hook';
- mouseProc:=false;
- {显示系统传来的wParam参数,w是各种鼠标消息的标识符 }
- form1.label1.caption:='wParam='+intTostr(w);
- {显示系统传来的lParam参数,l是MOUSEHOOKSTRUCT结构的地址}
- form1.label2.caption:='lParam='+intTostr(l);
- poff:=loword(l); {得到l的低16位}
- pseg:=hiword(l); {得到l的高16位}
- p:=ptr(pseg,poff); {合成指向MOUSEHOOKSTRUCT结构的指针}
- {显示屏幕上鼠标的X,Y坐标}
- form1.label3.caption:='pt.x='+intTostr(p^.pt.x)
- +' pt.y='+intTostr(p^.pt.y);
- {显示屏幕上鼠标下的窗口局柄}
- form1.label4.caption:='hwnd='+intTostr(P^.hwnd);
- pmemo:=stralloc(20);
- getWindowText(p^.hwnd,pmemo,20-1);
- {显示鼠标下窗口的标题栏}
- form1.label5.caption:=strPas(pmemo);
- getClassName(p^.hwnd,pmemo,20-1);
- {显示鼠标下窗口的类}
- form1.label6.caption:=strPas(pmemo);
- strDispose(pmemo);
- end;
- end.