windows键盘驱动:WINDOWS键盘事件的挂钩监控原理及其应用技术来源: 发布时间:星期二, 2008年12月30日 浏览:2次 评论:0
WINDOWS消息处理机制为了能在应用中监控系统各种事件消息提供了挂接 各种反调(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将其挂接在链首至于消息是否传递给函 数链下个是由每个具体功能确定如果消息需要传统给下个函 数可APICallNextHookEx来实现如果不传递直接返回即可 挂接可以是用来监控所有线程消息全局性也可以是单独监控某线程 局部性如果挂接是局部可以将它放到个.DLL动态链接库中 也可以放在个局部模块中;如果挂接是全局那么必须将其放在个.DLL 动态链接库中挂接必须严格按照下述格式进行声明以键盘挂钩为例: FAR PASCAL KeyboardProc( nCode,WORD wParam,DWORD lParam) 其中KeyboardProc为定义挂接名该必须在模块定义文件中利用EXPORTS命 令进行介绍说明;nCode决定挂接是否对当前消息进行处理;wParam和lParam为具体 消息内容 2、键盘事件挂接安装和下载 在中可以利用SetWindowsHookEx来挂接过滤在挂接时必须指 出该挂接类型、入口地址以及是全局性还是局部性挂接函 数具体格式如下: SetWindowsHookEx(iType,iProc,hInst,iCode) 其中iType为挂接类型键盘类型为WH_KEYBOARD,iProc为挂接地址hInst 为挂接链接库例子句柄iCode为监控代码-0表示全局性 如果挂接需要将消息传递给下个过滤则在该挂接返回前还需要调 用次CallNextHookEx当需要下载挂接时只要次 UnhookWindowsHookEx(iProc)即可实现 如果是全局性那么它必须放在个.DLL动态链接库中这时该方 法可以和其它普通.DLL样有 3种: 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然后直接在 项目文件中增加该输入库 3、WINDOWS挂钩监控实现步骤 WINDOWS挂钩只有放在动态链接库DLL中才能实现所有事件监控功能在.DLL 中形成挂钩监控基本思路方法及其基本结构如下: 1、首先声明DLL中变量和过程; 2、然后编制DLL主模块LibMain建立模块例子; 3、建立系统退出DLL机制WEP; 4、完成DLL化InitHooksDll,传递主窗口句柄; 5、编制挂钩安装和下载InstallFilter; 6、编制挂钩KeyboardProc在其中设置监控功能并确定继续调下个钩 子还是直接返回WINDOWS应用 7、在WINDOWS主中需要化DLL并安装相应挂钩由挂接钩子负 责和主通信; 8、在不需要监控时由下载功能卸掉挂接 4、WINDOWS下键盘挂钩监控应用技术 目前标准104 键盘上都有两个特殊按键其上分别用WINDOW徽标和鼠标下 拉列表标识本文暂且分别称为Micro左键和Micro右键前者用来模拟鼠标左键激 活开始菜单后者用来模拟鼠标右键激活属性菜单这两个特殊按键只有在按下后 立即抬起即完成 CLICK过程才能实现其功能并且没有和其它按键进行组合使用 由于WINDOWS 系统中将按键划分得更加详细使应用中很难灵活定义自己专 用快捷键比如在开发.IME等应用时很难找到不和WORD8.0等其它应用冲突 功能按键如果将标准104键盘中这两个特殊按键作为模拟CTRL和ALT 等专用按 键使其和其它按键组合就可以在自己应用中自由地设置专用功能键为 应用实现各种功能快捷键提供灵活性正常情况下WINDOWS 键盘事件驱动 并不将这两个按键消息进行正常解释这就必须利用键盘事件挂钩监控来 实现其特定功能其思路方法如下: 1、首先编制如下个简单动态链接库并编译成DLL文件 # "windows.h" FAR PASCAL LibMain(HANDLE hModule,UINT wDataSeg, UINT cbHeapSize,LPSTR lpszCmdLine); WINAPI WEP( bExit); WINAPI InitHooksDll(HWND hwndMainWindow); WINAPI InstallFilter(BOOL nCode); LRESULT CALLBACK KeyHook( nCode,WORD wParam,DWORD lParam); HANDLE hInstance; // 全局句柄 HWND hWndMain; // 主窗口句柄 InitCalled=0; // 化标志 HHOOK hKeyHook; FARPROC lpfnKeyHook=(FARPROC)KeyHook; BOOL HookStates=FALSE; FAR PASCAL LibMain( HANDLE hModule, UINT wDataSeg, UINT cbHeapSize, LPSTR lpszCmdLine) { (cbHeapSize!=0) UnlockData(0); hInstance = hModule; 1; } WINAPI WEP ( bExit) { 1;} WINAPI InitHooksDll(HWND hwndMainWindow) { hWndMain = hwndMainWindow; InitCalled = 1; (0); } WINAPI InstallFilter(BOOL nCode) { (InitCalled0) (-1); (nCodeTRUE) { hKeyHook=SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)lpfnKeyHook,hInstance,0); HookStates=TRUE; } { UnhookWindowsHookEx(hKeyHook); HookStates=FALSE; } (0); } LRESULT CALLBACK KeyHook( nCode,WORD wParam,DWORD lParam) { BOOL msflag=FALSE; (nCode>=0) { (HookStatesTRUE) { ((wParam0xff)|| //WIN3.X下按键值 (wParam0x5b)||(wParam0x5c)){//WIN95下按键值 ((i0x15b)||(i0x15c)){ //按键按下处理 msflag=TRUE; PostMessage(hWndMain,0x7fff,0x1,0x3L); } ((i0xc15b)||(i0xc15c)){//按键抬起处理 msflag=FALSE; PostMessage(hWndMain,0x7fff,0x2,0x3L); } } } } (()CallNextHookEx (hKeyHook,nCode,wParam,lParam)); } 该主要功能是监控键盘按键消息将两个特殊按键Micro按下和抬起消息转换 成自定义类型消息并将自定义消息发送给应用主窗口 2、在应用主中建立窗口后InitHooksDll来化动态链接 库并将应用主窗口句柄传递给链接库然后InstallFilter挂接键 盘事件监控回调 InitHooksDll(hIMEWnd); //化DLL InstallFilter(TRUE); //安装键盘回调 3、在应用主窗口处理自定义消息时保存Micro按键状态供组合按键 处理时判断使用 switch (iMessage) { 0x7fff: //自定义消息类型 (lParam0x3L) {//设置Micro键状态 (wParam0x1) MicroFlag=TRUE; (wParam0x2) MicroFlag=FALSE; } ; 4、在进行按键组合处理时首先判断Micro键是否按下然后再进行其它按键判 断处理 WM_KEYDOWN: // 按键按下处理 (MicroFlagTRUE) { //Micro键按下 ((BYTE)HIBYTE(wParam)0x5b) { //Micro+"["组合键 ......//按键功能处理 } ((BYTE)HIBYTE(wParam)0x5d) { //Micro+"]"组合键 ......//按键功能处理 } } ; 5、当应用退出时应注意下载键盘监控即InstallFilter(FALSE)函 数次 6、利用本文提供思路方法设置自己应用功能按键在保证功能按键不会 和其它系统发生冲突同时有效地利用了系统中现有资源而且在实现应用 功能同时灵活应用了系统中提供各种功能 0
相关文章
读者评论
发表评论 |