首页 | 我要逛街 | 商品库 | 新闻动态 | 供求信息 | 特色社区 | 特色论坛 设为首页 收藏本站
商业步行街 |啤酒街 |文化街 |婚纱街 |天幕美食城 |文具街 |体育街 |科技街 |家具街 | 电子街
 
首页 > 商城文章 > 电子 > 安防 监控器材 防盗报警 > Windows键盘事件监控原理及应用
Windows键盘事件监控原理及应用
作者:青岛特色街 文章来源:电子 发表日期:08-01-10 22:51:31 关注:
内容简介:

  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()将其挂接在函数链首。至于消息是否传递给函数链的下一个函数是由每个具体函数功能确定的,如果消息需要传统给下一个函数,可调用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,然后直接在项目文件中增加该输入库。

关于我们 | 联系我们 | 人才招聘 | 网站地图
特色街 皆特色 岛城首家特色综合社区
青岛特色街-版权所有 在线客服QQ:136928360 技术支持QQ:814002980
Copyright © 2007 0532ts.com Inc All Rights Reserved.
Powered By :青岛无言阁信息科技有限公司



鲁ICP证020117号
Designed By:Web08.net