用DELPHI编制钩子函数.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

用DELPHI编制钩子函数

Windows消息管理机构提供了能使应用程序访问控制消息流μ

c4所谓的钩子(HOOK)机制。钩子有多种,分别用于捕获某一特定类型或某一范围的消息。如:键盘消息,鼠标消息等。我们这里仅以键盘钩子的使用为例,讨论在DELPHI下怎样编写DLL程序和怎样在自己的程序中安装使用键盘钩子函数,并讨论了不同程序使用同一DLL文件时怎样共享数据。

一、钩子过滤函数的编写说明

由于钩子过滤函数必须在独立的模块中,也就是说我们必须首先生成一个DLL框架,然后再在其中加入钩子函数代码以及其他相关函数代码。我们这里以键盘钩子过滤函数的编写为例来说明。具体步骤如下:

1、先生成一个DLL框架

2、编写自己的键盘钩子过滤函数

钩子过滤函数必须是回调函数,其函数的声明为:

functionKeyHookProc(

iCode:Integer;

wParam:WPARAM;

lParam:LPARAM):LRESULT;stdcall;export;

在生成的DLL框架中加入自己的键盘钩子处理函数处理键盘消息。

代码如下:…

if(iCode=0)thenbegin

Result:=0;//初始化返回值

//在这里加入自己的代码

endelse

begin

Result:=CallNextHook(hOldKeyHook

iCode

wParam

lParam);

//hOldKeyHook是保存的原键盘过滤函数

end;

3、安装键盘钩子过滤函数

为安装一个钩子键盘过滤函数应调用SetWindowsHookEx函数(适用于Windows3.0的SetWindowsHook钩子安装函数现在已经废弃不用)。该函数的原形如下:

HHOOKSetWindowsHookEx(

intidHook

//安装的钩子类型

HOOKPROClpfn

//钩子过滤函数地址

HINSTANCEhMod

//任务句柄

DWORDdwThreadId//钩子用于的目的

);

需要说明的是:通常应该调用MakeProcInstance函数以获取一个输出函数的前导码的入口地址,再将此地址作为SetWindowsHookEx的第二个参数lpfn。但由于Delphi提供了灵巧调用(smartcallback),使得MakeProcInstance可以省去,而直接将钩子过滤函数名用作入口地址。

这样当应用程序用GetMessage或PeekMessage函数从消息队列中读消息或有按键消息(WM_KEYDOWN或WM_KEYUP)要处理时,系统就要调用钩子过滤函数KeyHookProc处理键盘消息。

4、卸载钩子过滤函数。

当钩子函数不再需要时,应调用UnHookWindowsHookProc卸载安装的钩子以释放系统资源。

完整的程序清单如下

LibraryKEYHOOK;

usesWindows;

constBUFFER_SIZE=16*1024;

constHOOK_MEM_FILENAME=SAMPLEKEY_HOOK_MEM_FILE;

constHOOK_MUTEX_NAME=SAMPLEKEY_HOOK_MUTEX_NAME;

type

TShared=record

Keys:array[0..BUFFER_SIZE]ofChar;

KeyCount:Integer;

end;

PShared=^TShared;

var

MemFile

HookMutex:THandle;

hOldKeyHook:HHook;

ProcSaveExit:Pointer;

Shared:PShared;

//键盘钩子过滤函数

functionKeyHookProc(iCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT

;stdcall;export;

constKeyPressMask=

begin

ifiCode0then

Result:=CallNextHookEx(hOldKeyHook

iCode

wParam

lParam)

elsebegin

if((lParamandKeyPressMask)=0)then//键按下

begin

Shared^.Keys[Shared^.KeyCount]:=Char(wParamand$00ff);

Inc(Shared^.KeyCount);

ifS

文档评论(0)

192****9449 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档