什么是勾子

什么是勾子
2007-01-17 09:13
----   在Windows系统中,勾子(hook)是一种特殊的消息处理机制。勾子可以监视系统或进程中的各种事件消息,      截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的勾子,监视系统中特定事件的发生,完成特定的功能,      比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用勾子可以实现许多特殊而有用的功能。           勾子的类型        ----1.   按事件分类,有如下的几种常用类型        ----(1)   键盘勾子和低级键盘勾子可以监视各种键盘消息(WH_KEYBOARD)。             ----(2)   鼠标勾子和低级鼠标勾子可以监视各种鼠标消息(WH_MOUSE)。             ----(3)   外壳勾子可以监视各种Shell事件消息。比如启动和关闭应用程序(WH_SHELL)。             ----(4)   日志勾子可以记录从系统消息队列中取出的各种事件消息(WH_JOURNALRECORD,WH_JOURNALPLAYBACK)。             ----(5)   窗口过程勾子监视所有从系统消息队列发往目标窗口的消息(WH_CALLWNDPROC)。             ----(6)   监视已被目标窗口函数处理的消息(WH_CALLWNDPROCRE)。           ----(7)   接受与计算机训练有关的消息(WH_CBT).           ----(8)   应用程序前台空闲时调用的钩子(WH_FOREGROUNDIDLE).           ----(9)   监视加入到消息队列中的消(WH_GETMESSAGE).           ----(10)监视由对话框消息菜单或者滚动条输入事件产生的消息(WH_MSGFILTER).             此外,还有一些特定事件的勾子提供给我们使用如:WH_MOUSE_LL,WH_KEYBOARD_LL,WH_SYMSGFILTER等等.           ----2.   按使用范围分类,主要有线程勾子和系统勾子             ----(1)   线程勾子监视指定线程的事件消息。             ----(2)   系统勾子监视系统中的所有线程的事件消息。因为系统勾子会影响系统中所有的应用程序,所以勾子函数必须放在独立的动态链接      库(DLL)   中。这是系统勾子和线程勾子很大的不同之处。             ----   几点需要说明的地方:             ----(1)   如果对于同一事件(如鼠标消息)既安装了线程勾子又安装了系统勾子,那么系统会自动先调用线程勾子,然后调用系统勾子。             ----(2)   对同一事件消息可安装多个勾子处理过程,这些勾子处理过程形成了勾子链。当前勾子处理结束后应把勾子信息传递给下一个勾子函数。             ----(3)   勾子特别是系统勾子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装勾子,在使用完毕后要及时卸载。             编写勾子程序        ----   编写勾子程序的步骤分为三步:定义勾子函数、安装勾子和卸载勾子。        ----1.定义勾子函数             ----勾子函数是一种特殊的回调函数。勾子监视的特定事件发生后,系统会调用勾子函数进行处理。不同事件的勾子函数的形式是各不相同的。下面以鼠标勾子函数举例说明勾子函数的原型:             LRESULT   CALLBACK   MouseProc      (     int   nCode,   WPARAM   wParam,   LPARAM   lParam)           ----参数wParam和   lParam包含鼠标消息的信息,比如鼠标位置、状态等。nCode包含有关消息本身的信息,比如是否从消息队列中移出。             ----   我们先在勾子函数中实现自定义的功能,然后调用函数   CallNextHookEx.把勾子信息传递给勾子链的下一个勾子函数。CallNextHookEx.的原型如下:             LRESULT   CallNextHookEx      (   HHOOK   hhk,     int   nCode,          WPARAM   wParam,   LPARAM   lParam   )           ----参数   hhk是勾子句柄。nCode、wParam和lParam   是勾子函数。下面的例子是一个简单的监视鼠标消息的勾子函数:             LRESULT   CALLBACK     MouseProc      (int   nCode,   WPARAM   wParam,   LPARAM   lParam)      {              //跟踪鼠标移动时的位置变化信息      if(wParam==WM_MOUSEMOVE   ||   wParam==                          WM_NCMOUSEMOVE)        {         //是鼠标移动消息      point=((MOUSEHOOKSTRUCT   *)      lParam)->pt;//取鼠标信息      TRACE2(“Position   is   :%d,Y:%d/n",point.x,point.y);      }      //传递勾子信息      return   CallNextHookEx(hHook,nCode,wParam,lParam);      }           ----2.安装勾子             ----在程序初始化的时候,调用函数SetWindowsHookEx安装勾子。其函数原型为:             HHOOK   SetWindowsHookEx      (   int   idHook,HOOKPROC   lpfn,        INSTANCE   hMod,DWORD   dwThreadId     )           ----参数idHook表示勾子类型,它是和勾子函数类型一一对应的。比如,WH_KEYBOARD表示安装的是键盘勾子,WH_MOUSE表示是鼠标勾子等等。             ----Lpfn是勾子函数的地址。             ----HMod是勾子函数所在的实例的句柄。对于线程勾子,该参数为NULL;对于系统勾子,该参数为勾子函数所在的DLL句柄。             ----   dwThreadId   指定勾子所监视的线程的线程号。对于全局勾子,该参数为NULL。             ----SetWindowsHookEx返回所安装的勾子句柄。             ----3.卸载勾子             ----   当不再使用勾子时,必须及时卸载。简单地调用函数   BOOL   UnhookWindowsHookEx(   HHOOK   hhk)即可。             ----   值得注意的是线程勾子和系统勾子的勾子函数的位置有很大的差别。线程勾子一般在当前线程或者当前线程派生的线程内,而系统勾子必须放在独立的动态链接库中,实现起来要麻烦一些。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Pytest中,勾子函数(Hook Functions)是用于自定义测试执行过程的函数。通过在测试文件中定义特定名称的函数,可以在不同的测试阶段插入自定义的逻辑。以下是一些常用的Pytest勾子函数: 1. pytest_configure(config): 在整个测试运行过程之前调用。可以用于初始化测试配置或插件。 2. pytest_collection_modifyitems(config, items): 收集所有测试项目后,可以修改测试项目的列表。可以用于筛选、排序或修改测试项目。 3. pytest_runtest_protocol(item, nextitem): 在每个测试项目(测试函数或测试类)执行之前和之后调用。可以用于在测试前后执行一些操作,比如设置和清理测试环境。 4. pytest_runtest_setup(item): 在每个测试项目的设置阶段(测试函数或测试类的setUp方法)之前调用。可以用于在每个测试项目的设置阶段执行一些操作。 5. pytest_runtest_call(item): 在每个测试项目的执行阶段(测试函数或测试类的具体执行)之前调用。可以用于在每个测试项目的执行阶段执行一些操作。 6. pytest_runtest_teardown(item, nextitem): 在每个测试项目的拆卸阶段(测试函数或测试类的tearDown方法)之后调用。可以用于在每个测试项目的拆卸阶段执行一些操作。 7. pytest_sessionstart(session): 在整个测试会话开始之前调用。可以用于执行一些全局初始化操作。 8. pytest_sessionfinish(session, exitstatus): 在整个测试会话结束之后调用。可以用于执行一些全局清理操作。 这只是一小部分Pytest提供的勾子函数,还有其他许多可以用于自定义测试行为和扩展功能的勾子函数。通过在测试文件中定义这些函数,可以根据需要定制测试执行过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值