解决方案:使用Delphi实现Windows的鼠标挂钩功能

电脑杂谈  发布时间:2020-09-10 14:02:13  来源:网络整理

鼠标钩子函数_钩子函数_鼠标钩子函数

Delphi是基于PASCAL语言的Windows编程工具,具有非常强大的功能。但是在Delphi的帮助下

在文档中,Windows API函数的描述遵循VC的格式,许多API函数的用法与VC相同。

这里没有详细的示例,系统中一些API函数更加模糊,这给程序员带来了不便。

作者仅使用一个示例来说明Windows编程中鼠标挂钩功能(HOK)的实山词霸”,在鼠标钩子函数中调用InvalidateRect()和InvalidateRgn()以获取屏幕

鼠标在屏幕上的单词。 (有关屏幕截图的详细信息,请参阅作者的“ Inside Windows Explorer”《中国计算机报》

不。 1998年第81期。

主程序SPY及其动态链接库MOUSEDLL的原始代码和详细注释如下:

{************************************************** *******

文件:1998/11/18

〉 DLL:MOUSEDLL.DLL

导出:sethook用于安装鼠标钩子函数mouseproc

取消挂钩,卸载鼠标挂钩功能mouseproc

mouseproc鼠标钩子功能本身

*************************************************** ******}

库Mousedll;

使用

'MOUSEP.PAS'{Form1}中的慕斯;

出口

sethook,

摘机,

mouseproc;

{$ R * .RES}

开始

结束。

{************************************************** ***************

钩子函数_鼠标钩子函数_鼠标钩子函数

文件:

实现setHook取消mouseProc 3输出功能

*************************************************** **************}

Mousep单位;

界面

使用

SysUtils,WinTypes,WinProcs,消息,类,图形,控件,

表单,对话框,StdCtrls;

{DLL中也可以有FORM变量}

类型

TForm1 =类(TForm)

标签1:TLabel; {display wParam}

Label2:TLabel; {display lParam}

Label3:TLabel; {display x,y}

Label4:TLabel; {display hwnd}

Label5:TLabel; {显示窗口文字}

Label6:TLabel;

Label7:TLabel; {display window class}

私人

{私人声明}

公开

{公开声明

end;

功能sethook:bool; export;

功能解锁:bool; export;

function mouseProc(code:integer; w:integer; l:longint):bool; export;

var

Form1:TForm1;

idhook:longint;

formok:bool;

实现

{************************************************** ***********************

声明安装函数setWindowsHookEx(),

如果在Delphi中使用函数setWindowsHook(),则无需声明它。

Microsoft表示,setWindowsHook函数已在Windows 3. 1中弃用,并且仍保留为与Windows 3. 0兼容。

实际上,setWindowsHook函数仍可以在Windows 3. 1和Windows95中使用。

{************************************************** ***********************}

函数setwindowsHookEx(id:integer; proc:tfarproc; hinst,htask:thandle):

鼠标钩子函数_钩子函数_鼠标钩子函数

longint; far;外部“用户”;

{$ R * .DFM}

{安装鼠标钩子功能mouseProc}

功能sethook:bool;

var

hinst:thandle; {动态链接库自己的模块句柄}

proc:tfarproc; {鼠标钩子函数mouseProc的地址}

开始

{在动态链接库中创建form1}

如果formok = false,则form1:= tform 1. create(application)否则退出;

formok:= true; {安装form1后,设置formok,不要再次安装form1}

{动态链接库的应用是指:调用动态链接库的主程序}

form 1. show;

{请勿使用系统菜单双击以关闭Form1}

form 1. BorderIcons:= form 1. BorderIcons- [biSystemMenu];

hinst:= getModuleHandle('mousedll');

{获取mousedll.dll的模块句柄,即动态链接库的模块句柄}

proc:= getProcAddress(hinst,'mouseProc');

idhook:= setWindowsHookEx(WH_MOUSE,proc,hinst,0);

{安装了带有WH_MOUSE参数的鼠标挂钩后,移动鼠标时,系统会自动调用mouseProc挂钩}

如果idhook = 0,则sethook:= false,否则sethook:= true;

end;

{卸载鼠标钩子功能mouseProc}

功能摘机:布尔;

开始

如果formok = true,则返回form 1. free,否则退出; {检查form1是否已关闭}

formok:= false; {关闭form1,设置formok = 0}

如果idhook = 0,则退出;

unhookWindowsHookEx(idhook);

摘机:= true;

end;

{mouseProc不是由应用程序调用,而是在鼠标移动后由系统调用}

function mouseProc(code:integer; w:integer; l:longint):bool;

var

p:^ TMouseHookStruct;

poff:word;

pseg:word;

pmemo:pchar;

鼠标钩子函数_鼠标钩子函数_钩子函数

开始

如果代码mouseProc:= true;

CallNextHookEx(idhook,0,w,l);

end;

如果code = HC_NOREMOVE,则形成1.标题:='HC_NOREMOVE';

form 1.说明:='鼠标钩';

mouseProc:= false;

{显示系统中的wParam参数,w是各种鼠标消息的标识符}

form 1. label 1.标题:='wParam ='+ intTostr(w);

{显示系统中的lParam参数,l是MOUSEHOOKSTRUCT结构的地址}

form 1. label 2.说明:='lParam ='+ intTostr(l);

poff:= loword(l); {获得l的低16位}

pseg:= hiword(l); {获得l的高16位}

p:= ptr(pseg,poff); {合成指向MOUSEHOOKSTRUCT结构的指针}

{在屏幕上显示鼠标的X,Y坐标}

form 1. label 3.标题:='pt.x ='+ intTostr(p ^ .pt.x)

+'pt.y ='+ intTostr(p ^ .pt.y);

{在屏幕上的鼠标下方显示窗口句柄}

form 1. label 4.说明:='hwnd ='+ intTostr(P ^ .hwnd);

pmemo:= stralloc(2 0);

getWindowText(p ^ .hwnd,pmemo,20- 1);

{在鼠标下方显示窗口的标题栏}

form 1. label 5.说明:= strPas(pmemo);

getClassName(p ^ .hwnd,pmemo,20- 1);

{在鼠标下显示窗口的类别}

form 1. label 6.说明:= strPas(pmemo);

strDispose(pmemo);

end;

结束。

主程序的原始代码如下:

{***********************************************

**********************************************}

程序维护;

使用

表格

在“ TRYP.PAS” {Form1}中尝试;

{$ R * .RES}

开始

鼠标钩子函数_钩子函数_鼠标钩子函数

Application.CreateForm(TForm1,Form 1);

Application.Run;

结束。

{************************************************** ***

************************************************}

单位Tryp;

界面

使用

SysUtils,WinTypes,WinProcs,消息,类,图形,控件,

表单,对话框,StdCtrls;

类型

TForm1 =类(TForm)

Button1:TButton; {安装setHook按钮}

Button2:TButton; {删除摘机按钮}

标签1:TLabel; {显示安装,是否卸载成功}

过程Button1Click(发件人:TObject);

过程Button2Click(Sender:TObject);

私人

{私人声明}

公开

{公开声明

end;

var

Form1:TForm1;

实现

功能sethook:bool; far; external'mousedll';

函数unhook:bool; far; external'mousedll';

{声明后自动加载模块mousedll.dll}

{$ R * .DFM}

过程TForm 1. Button1Click(Sender:TObject);

开始

如果设置钩子,则标签1.标题:=“设置钩子确定”; {安装鼠标钩子功能}

end;

过程TForm 1. Button2Click(Sender:TObject);

开始

如果摘机,则贴上标签1.标题:='摘机好'; {解开鼠标钩功能}

end;

结束。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-317983-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...