Windows Hook 学习1

      windows hook是windows消息处理机制中的一个切入点,通过它,应用程序可以设置一个子过程来监视系统的消息流,并在某个特定的消息到达对应窗口前,对该消息进行处理。

     钩子会降低系统的速度,因为它增加了处理过程,这些过程是是系统必须为每个消息处理而调用的。你必须在必要的时候使用钩子,而且尽快的释放它。

    钩子链(Hook Chains)

    系统迟滞许多不同类型的钩子,每一种类型都提供了一种不同的访问消息处理的机制。比如,一个应用程序可以使用鼠标钩子(WH_MOUSE HOOK)去吉安市鼠标消息流。

    系统为每个钩子类型提供了不同的钩子链。所谓钩子链是一个指针序列,每个指针指向一个特定的、应用程序定义的回调函数,称为钩子过程(hook procedure)。当一个关联于某个特定钩子类型的消息产生后,系统会将这个消息传给钩子链中的每个钩子过程,并一个接一个的调用之。一个钩子过程所能采取的行为决定于引发的钩子类型。对于一些钩子类型,他们的钩子过程只能监视特定的消息,而且一些钩子过程则可以改变消息或者停止钩子链的传递过程,从而组织向下一个钩子的控制流传递,甚至目标窗口。

    钩子过程(Hook Procedures)

    为了能够使用特定钩子类型,我们必须提供一个钩子过程并用SetWindowsHookEx API在特定的钩子链上安装一个钩子过程。一个钩子过程是下面酱紫(:D)的回调函数:

LRESULT CALLBACK HookProc( int nCode,  WPARAM wParam,  LPARAM lParam);//HookProc只是个站位名字,具体的回调函数名由应用程序定义。

nCode参数是一个钩子代码,用来给钩子过程指明行为。它的值有特定钩子类型决定的。每一个钩子类型都有一组特定的钩子代码。wParam和lParam参数决定以钩子代码,但一般来说这两个参数包含了发送或者接受的对应消息的信息。

    SetWindowsHookEx API函数会将一个钩子过程安装在钩子链的开始。但一个受监听的事件发生后,系统会从这个事件对应的钩子链的起始处开始调用钩子过程。每个钩子链中的钩子过程都决定是否将这个事件传给其后继过程。钩子过程通过CallNextHookEx api来调用后继过程。需要说明的是,对于一些只能监视消息的钩子类型,系统会传递消息给每个钩子过程,而忽略钩子过程是否调用CallNextHookEx。

    一个全局钩子将监视调用线程所在桌面下的所有线程的消息。一个线程相关的钩子(thread-specific hook)将监视单独的线程的消息。一个全局钩子能够被调用线程所在桌面的所有应用程序的实例调用,所以这个过程必须在一个动态链接库中,作为其中一个moudle。而一个线程相关的钩子过程只能被所关联的线程的上下文调用。如果一个程序为自己的线程注册一个钩子过程,那么这个钩子过程既可以在这个程序的相同模块(moudule)或者一个dll中。如果一个程序给其他一个不同的程序注册一个钩子过程,那么这个钩子过程必须在dll中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值