
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
甲午海战时
小编你是无知还是意淫
泄浊屎