WINDOWS键盘事件的挂钩监控原理及其应用技术.docx_第1页
WINDOWS键盘事件的挂钩监控原理及其应用技术.docx_第2页
WINDOWS键盘事件的挂钩监控原理及其应用技术.docx_第3页
WINDOWS键盘事件的挂钩监控原理及其应用技术.docx_第4页
WINDOWS键盘事件的挂钩监控原理及其应用技术.docx_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WINDOWS键盘事件的挂钩监控原理及其应用技术 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定义文件中直接用函数名或序号说明:EXPORTSWEP 1 RESIDENTNAMEInitHooksDll 2InstallFilter 3KeyboardProc 4用序号说明格式为:链接库名.函数名(如本例中说明方法为KEYDLL.KeyboardProc)。2.在应用程序中利用函数直接调用:首先在应用程序中利用LoadLibrary(LPSTR 链接库名)将动态链接库装入,并取得装载库模块句柄hInst,然后直接利用GetProcAddress(HINSTANCE hInst,LPSTR 函数过程名)获取函数地址,然后直接调用该地址即可,程序结束前利用函数FreeLibrary( )释放装入的动态链接库即可。3.利用输入库.LIB方法利用IMPLIB.EXE程序在建立动态链接库的同时建立相应的输入库.LIB,然后直接在项目文件中增加该输入库。三、WINDOWS挂钩监控函数的实现步骤WINDOWS挂钩函数只有放在动态链接库DLL中才能实现所有事件的监控功能。在.DLL中形成挂钩监控函数基本方法及其基本结构如下:、首先声明DLL中的变量和过程;、然后编制DLL主模块LibMain(),建立模块实例;、建立系统退出DLL机制WEP()函数;、完成DLL初始化函数InitHooksDll(),传递主窗口程序句柄;、编制挂钩安装和下载函数InstallFilter();、编制挂钩函数KeyboardProc(),在其中设置监控功能,并确定继续调下一个钩子函数还是直接返回WINDOWS应用程序。、在WINDOWS主程序中需要初始化DLL并安装相应挂钩函数,由挂接的钩子函数负责与主程序通信;、在不需要监控时由下载功能卸掉挂接函数。四、WINDOWS下键盘挂钩监控函数的应用技术目前标准的104 键盘上都有两个特殊的按键,其上分别用WINDOW程序徽标和鼠标下拉列表标识,本文暂且分别称为Micro左键和Micro右键,前者用来模拟鼠标左键激活开始菜单,后者用来模拟鼠标右键激活属性菜单。这两个特殊按键只有在按下后立即抬起即完成 CLICK过程才能实现其功能,并且没有和其它按键进行组合使用。由于WINDOWS 系统中将按键划分得更加详细,使应用程序中很难灵活定义自己的专用快捷键,比如在开发.IME等应用程序时很难找到不与WORD8.0等其它应用程序冲突的功能按键。如果将标准104键盘中的这两个特殊按键作为模拟CTRL和ALT 等专用按键,使其和其它按键组合,就可以在自己的应用程序中自由地设置专用功能键,为应用程序实现各种功能快捷键提供灵活性。正常情况下WINDOWS 键盘事件驱动程序并不将这两个按键的消息进行正常解释,这就必须利用键盘事件的挂钩监控函数来实现其特定的功能。其方法如下:、首先编制如下一个简单动态链接库程序,并编译成DLL文件。#include windows.hint 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);LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam);static HANDLE hInstance; / 全局句柄static HWND hWndMain; / 主窗口句柄static int InitCalled=0; / 初始化标志static HHOOK hKeyHook;FARPROC lpfnKeyHook=(FARPROC)KeyHook;BOOL HookStates=FALSE;int FAR PASCAL LibMain(HANDLE hModule,UINT wDataSeg,UINT cbHeapSize,LPSTR lpszCmdLine)if (cbHeapSize!=0) UnlockData(0);hInstance = hModule;return 1;int WINAPI WEP (int bSystemExit) return 1;int WINAPI InitHooksDll(HWND hwndMainWindow) hWndMain = hwndMainWindow;InitCalled = 1;return (0);int WINAPI InstallFilter(BOOL nCode) if (InitCalled=0) return (-1);if (nCode=TRUE) hKeyHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)lpfnKeyHook,hInstance,0);HookStates=TRUE; else UnhookWindowsHookEx(hKeyHook);HookStates=FALSE;return(0);LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam)static BOOL msflag=FALSE;if(nCode=0) if(HookStates=TRUE)if(wParam=0xff)| /WIN3.X下按键值(wParam=0x5b)|(wParam=0x5c)/WIN95下按键值if(i=0x15b)|(i=0x15c) /按键按下处理msflag=TRUE;PostMessage(hWndMain,0x7fff,0x1,0x3L); else if(i=0xc15b)|(i=0xc15c)/按键抬起处理msflag=FALSE;PostMessage(hWndMain,0x7fff,0x2,0x3L);return(int)CallNextHookEx(hKeyHook,nCode,wParam,lParam);该程序的主要功能是监控键盘按键消息,将两个特殊按键Micro按下和抬起消息转换成自定义类型的消息,并将自定义消息发送给应用程序主窗口函数。、在应用程序主函数中建立窗口后,调用InitHooksDll()函数来初始化动态链接库,并将应用程序主窗口句柄传递给链接库,然后调用InstallFilter()函数挂接键盘事件监控回调函数。InitHooksDll(hIMEWnd); /初始化DLLInstallFilter(TRUE); /安装键盘回调函数、在应用程序主窗口函数处理自定义消息时,保存Micro按键的状态,供组合按键处理时判断使用。switch (iMessage) case 0x7fff: /自定义消息类型if(lParam=0x3L)/设置Micro键的状态if(wParam=0x1) MicroFlag=TRUE;else if(wParam=0x2) MicroFlag=FALSE;break;、在进行按键组合处理时,首先判断Micro键是否按下,然后再进行其它按键的判断处理。case WM_KEYDOWN: / 按键按下处理if(MicroFlag=TRUE)/Micro键按下if(BYTE)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论