请教关于Hook类型与调用的关系?
问题描述:[摘抄自一文章]
Windows调用传递到SetWindowsHookEx()的回调函数时,它们会因不同类型的钩子而被区别调用。基本上有两种情况:切换执行上下文的钩子和不切换执行上下文的钩子。用另一种方式说,也就是,在放钩子的应用程序进程空间执行钩子回调函数的情况和在被钩住的应用程序进程空间执行钩子回调函数的情况。
据我所知:
钩子类型例如鼠标和键盘钩子都是在被Windows调用之前切换上下文的。整个过程大致如下:
1. 应用程序X拥有焦点并执行。
2. 用户按下一个键。
3. Windows从应用程序X接管上下文并把执行上下文切换到放钩子的应用程序。
4. Windows用放钩子的应用程序进程空间中的键消息参数调用钩子回调函数。
5. Windows从放钩子的应用程序接管上下文并把执行上下文切换回应用程序X。
6. Windows把消息放进应用程序X的消息排队。
7. 稍微一会儿之后,当应用程序X执行时,它从自己的消息排队中取出消息并且调用它的内部按键(或松开或按下)处理器。
8. 应用程序X继续执行...
例如CBT钩子(window创建,等等。)的钩子类型并不切换上下文。对于这些类型的钩子,过程大致如下:
1. 应用程序X拥有焦点并执行。
2. 应用程序X创建一个窗口。
3. Windows用在应用程序X进程空间中的CBT事件消息参数调用钩子回调函数。
4. 应用程序X继续执行...
我的问题是,除了上面的鼠标,键盘,CBT钩子外,其他那几个钩子的调用类型是什么呢?
我用C#测试调用了CALLWNDPROCRET HOOK,他好像也是一个不切换上下文钩子!
请教一下,答案是什么?