HOOK例程

在许多系统中,出于安全或其它原因,常常要求随时对键盘进行监控,一个专业的监控程序必须具备两点,一是实时;二是作为指示图标运行。实际应用中把利用 Hook(即钩子)技术编写的应用程序添加到Windows的任务栏的指示区中就能够很好的达到这个目的。我在参考了API帮助文档基础上,根据在 Delphi开发环境中的具体实现分别对这两部分进行详细论述。
    一、Hook(钩子)的实现:Hook是应用程序在MicrosoftWindows消息处理过程中设置的用来监控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现Hook的方式。


    在许多系统中,出于安全或其它原因,常常要求随时对键盘进行监控,一个专业的监控程序必须具备两点,一是实时;二是作为指示图标运行。实际应用中把利用 Hook(即钩子)技术编写的应用程序添加到Windows的任务栏的指示区中就能够很好的达到这个目的。我在参考了API帮助文档基础上,根据在 Delphi开发环境中的具体实现分别对这两部分进行详细论述。
    一、Hook(钩子)的实现:Hook是应用程序在MicrosoftWindows消息处理过程中设置的用来监控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现Hook的方式。
   1.新建一个导出两个函数的DLL文件,在hookproc.pas中定义了钩子具体实现过程。代码如下:librarykeyspy;
useswindowsmessageshookprocin'hookproc.pas';
exportssetkeyhookendkeyhook;
beginnexthookproc:=0;
procsaveexit:=exitproc;
exitproc:=@keyhookexit;
end.
2.在Hookproc.pas中实现了钩子具体过程:unithookproc;
interfaceusesWindowsMessagesSysUtilsControlsStdCtrls;
varnexthookproc:hhook;
procsaveexit:pointer;
functionkeyboardhook(icode:integer;wparam:wparam;lparam:lparam):lresult;
stdcall;
export;
functionsetkeyhook:bool;export;//加载钩子functionendkeyhook:bool;export;//卸载钩子procedurekeyhookexit;
far;
constafilename='c:/debug.txt';//将键盘输入动作写入文件中vardebugfile:textfile;
implementationfunctionkeyboardhookhandler(icode:integer;wparam:wparam;lparam:lparam):lresult;
stdcall;
export;
beginificode<0thenbeginresult:=callnexthookex(hnexthookprocicodewparamlparam);
exit;
end;
assignfile(debugfileafilename);
append(debugfile);
ifgetkeystate(vk_return)<0thenbeginwriteln(debugfile'');
write(debugfilechar(wparam));
endelsewrite(debugfilechar(wparam));
closefile(debugfile);
result:=0;
end;
functionendkeyhook:bool;
export;
beginifnexthookproc<>0thenbeginunhookwindowshookex(nexthookproc);
nexthookproc:=0;
messagebeep(0);
end;
result:=hnexthookproc=0;
end;
procedurekeyhookexit;
far;
beginifnexthookproc<>0thenendkeyhook;
exitproc:=procsaveexit;
end;
end.
二、Win95/98使用任务栏右方指示区来显示应用程序或工具图标对指示区图标的操作涉及了一个API函数Shell_NotifyIcon,它有两个参数,一个是指向TnotifyIconData结构的指针,另一个是要添加、删除、改动图标的标志。通过该函函数将应用程序的图标添加到指示区中,使其作为图标运行增加专业特色。当程序起动后,用鼠标右键点击图标,则弹出一个菜单,可选择sethook或endhook。
unitkb;
interfaceusesWindowsMessagesSysUtilsClassesGraphicsControlsFormsDialogsStdCtrlsMenusshellapi;
consticon_id=1;
MI_iconevent=wm_user+1;//定义一个用户消息typeTForm1=class(TForm)
PopupMenu1:TPopupMenu;
sethook1:TMenuItem;
endhook1:TMenuItem;
N1:TMenuItem;
About1:TMenuItem;
Close1:TMenuItem;
Gettext1:TMenuItem;
procedureFormCreate(Sender:TObject);
proceduresethook1Click(Sender:TObject);
procedureendhook1Click(Sender:TObject);
procedureFormDestroy(Sender:TObject);
procedureClose1Click(Sender:TObject);
private{Privatedeclarations}
nid:tnotifyicondata;
normalicon:ticon;
public{Publicdeclarations}
procedureicontray(varmsg:tmessage);
messagemi_iconevent;
end;
varForm1:TForm1;
implementation{$R*.DFM}
functionsetkeyhook:bool;
external'keyspy.dll';
functionendkeyhook:bool;
external'keyspy.dll';
proceduretform1.icontray(varmsg:tmessage);
varpt:tpoint;
beginifmsg.lparam=wm_lbuttondownthensethook1click(self);
ifmsg.LParam=wm_rbuttondownthenbegingetcursorpos(pt);
setforegroundwindow(handle);
popupmenu1.popup(pt.xpt.y);
end;
end;
procedureTForm1.FormCreate(Sender:TObject);
beginnormalicon:=ticon.create;
application.title:=caption;
nid.cbsize:=sizeof(nid);
nid.wnd:=handle;
nid.uid:=icon_id;
nid.uflags:=nif_iconornif_messageornif_tip;
nid.ucallbackmessage:=mi_iconevent;
nid.hIcon:=normalicon.handle;
strcopy(nid.sztippchar(caption));
nid.uFlags:=nif_messageornif_iconornif_tip;shell_notifyicon(nim_add@nid);
SetWindowLong(Application.HandleGWL_EXSTYLEWS_EX_TOOLWINDOW);
end;
procedureTForm1.sethook1Click(Sender:TObject);
beginsetkeyhook;
end;
procedureTForm1.endhook1Click(Sender:TObject);
beginendkeyhook;
end;
procedureTForm1.FormDestroy(Sender:TObject);
beginnid.uFlags:=0;
shell_notifyicon(nim_delete@nid);
end;
procedureTForm1.Close1Click(Sender:TObject);
beginapplication.terminate;
end;
该程序虽然只用了几个shellai函数,但是它涉及到了在Delphi中对DLL的引用、钩子实现、对指示区的操作、用户定义消息的处理、文件的读写等比较重要的内容,我相信这篇文章能对许多Delphi的初学者有所帮助。
该程序在Win98、Delphi4.0中正常运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值