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中。