WINDOWS键盘事件的挂钩监控原理及其应用技术

2008-02-23 05:36:41来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

WINDOW的消息处理机制为了能在应用程式中监控系统的各种事件消息,提供了挂接各种反调函数(HOOK)的功能。这种挂钩函数(HOOK)类似扩充中断驱动程式,挂钩上能够挂接多个反调函数构成一个挂接函数链。系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监控、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。WINDOW系统的这种反调函数挂接方法虽然会略加影响到系统的运行效率,但在很多场合下是很有用的,通过合理有效地利用键盘事件的挂钩函数监控机制能够达到预想不到的良好效果。

一、在WINDOWS键盘事件上挂接监控函数的方法

WINDOW下可进行挂接的过滤函数包括11种:

WH_CALLWNDPROC 窗口函数的过滤函数

WH_CBT 电脑培训过滤函数

WH_DEBUG 调试过滤函数

WH_GETMESSAGE 获取消息过滤函数

WH_HARDWARE 硬件消息过滤函数

WH_JOURNALPLAYBACK 消息重放过滤函数

WH_JOURNALRECORD 消息记录过滤函数

WH_MOUSE 鼠标过滤函数

WH_MSGFILTER 消息过滤函数

WH_SYSMSGFILTER 系统消息过滤函数

WH_KEYBOARD 键盘过滤函数

其中键盘过滤函数是最常用最有用的过滤函数类型,不管是哪一种类型的过滤函数,其挂接的基本方法都是相同的。
WINDOW调用挂接的反调函数时总是先调用挂接链首的那个函数,因此必须将键盘挂钩函数利用函数SetWindowsHookEx()将其挂接在函数链首。至于消息是否传递给函数链的下一个函数是由每个具体函数功能确定的,假如消息需要传统给下一个函数,可调用API函数的CallNextHookEx()来实现,假如不传递直接返回即可。挂接函数能够是用来监控任何线程消息的全局性函数,也能够是单独监控某一线程的局部性函数。假如挂接函数是局部函数,能够将他放到一个.DLL动态链接库中,也能够放在一个局部模块中;假如挂接函数是全局的,那么必须将其放在一个.DLL动态链接库中。挂接函数必须严格按照下述格式进行声明,以键盘挂钩函数为例:

int FAR PASCAL KeyboardProc(int nCode,WORD wParam,DWORD lParam)

其中KeyboardProc为定义挂接函数名,该函数必须在模块定义文档中利用EXPORTS命令进行说明;nCode决定挂接函数是否对当前消息进行处理;wParam和lParam为具体的消息内容。



二、键盘事件挂接函数的安装和下载

在程式中能够利用函数SetWindowsHookEx()来挂接过滤函数,在挂接函数时必须指出该挂接函数的类型、函数的入口地址连同函数是全局性的还是局部性的,挂接函数的具体调用格式如下:

SetWindowsHookEx(iType,iProc,hInst,iCode)

其中iType为挂接函数类型,键盘类型为WH_KEYBOARD,iProc为挂接函数地址,hInst为挂接函数链接库实例句柄,iCode为监控代码-0表示全局性函数。假如挂接函数需要将消息传递给下一个过滤函数,则在该挂接函数返回前还需要调用一次CallNextHookEx()函数,当需要下载挂接函数时,只要调用一次UnhookWindowsHookEx(iProc)函数即可实现。假如函数是全局性的,那么他必须放在一个.DLL动态链接库中,这时该函数调用方法能够和其他普通.DLL函数相同有三种:

1.在DEF定义文档中直接用函数名或序号说明:

EXPORTS

WEP @1 RESIDENTNAME

InitHooksDll @2

InstallFilter @3

KeyboardProc @4

用序号说明格式为:链接库名.函数名(如本例中说明方法为KEYDLL.KeyboardProc)。

2.在应用程式中利用函数直接调用:

首先在应用程式中利用LoadLibrary(LPSTR "链接库名")将动态链接库装入,并取得装载库模块句柄hInst,然后直接利用GetProcAddress(HINSTANCE hInst,LPSTR "函数过程名")获取函数地址,然后直接调用该地址即可,程式结束前利用函数FreeLibrary( )释放装入的动态链接库即可。

3.利用输入库.LIB方法

利用IMPLIB.EXE程式在建立动态链接库的同时建立相应的输入库.LIB,然后直接在项目文档中增加该输入库。



三、WINDOWS挂钩监控函数的实现步骤

WINDOWS挂钩函数只有放在动态链接库DLL中才能实现任何事件的监控功能。在.DLL中形成挂钩监控函数基本方法及其基本结构如下:

1、首先声明DLL中的变量和过程;

2、然后编制DLL主模块LibMain(),建立模块实例;

3、建立系统退出DLL机制WEP()函数;

4、完成DLL初始化函数InitHooksDll(),传递主窗口程式句柄;

5、编制挂钩安装和下载函数InstallFilter();

6、编制挂钩函数KeyboardProc(),在其中配置监控功能,并确定继续调下一个钩

子函数还是直接返回WINDOWS应用程式。

7、在WINDOWS主程式中需要初始化DLL并安装相应挂钩函数,由挂接的钩子函数负

责和主程式通信;

8、在无需监控时由下载功能卸掉挂接函数。

四、WINDOWS下键盘挂钩监控函数的应用技术



现在标准的104 键盘上都有两个特别的按键,其上分别用WINDOW程式徽标和鼠标下拉列表标识,本文暂且分别称为Micro左键和Micro右键,前者用来模拟鼠标左键激活开始菜单,后者用来模拟鼠标右键激活属性菜单。这两个特别按键只有在按下后立即抬起即完成 CLICK过程才能实现其功能,并且没有和其他按键进行组合使用。由于WINDOWS 系统中将按键划分得更加周详,使应用程式中很难灵活定义自己的专用快捷键,比如在研发.IME等应用程式时很难找到不和WORD8.0等其他应用程式冲突的功能按键。假如将标准104键盘中的这两个特别按键作为模拟CTRL和ALT 等专用按键,使其和其他按键组合,就能够在自己的应用程式中自由地配置专用功能键,为应用程式实现各种功能快捷键提供灵活性。正常情况下WINDOWS 键盘事件驱动程式并不将这两个按键的消息进行正常解释,这就必须利用键盘事件的挂钩监控函数来实现其特定的功能。其方法如下:

1、首先编制如下一个简单动态链接库程式,并编译成DLL文档。

#include "windows.h"

int FAR PASCAL LibMain(HANDLE hModule,UINT wDataSeg,UINT cbHeapSize,LPSTR lpszCmdLine);

int WINAPI WEP(int bSystemExit);

int WINAPI InitHooksDll(HWND hwndMainWindow);

int WINAPI InstallFilter(BOOL nCode);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 如何读写硬件端口

下一篇: 拦截Windows消息