第一个参数w h _ g e t m e s s a g e用于指明要安装的挂钩的类型.第二个参数g e t m s g p r o c用于指明窗口准备处理一个消息时系统应该调用的函数的地址(在你的刂房占渲校5三个参数h i n s t d l l用于指明包含g e t m s g p r o c函数的d l l.在wi n d o w s中,d l l的h i n s t d l l的值用于标识dll被映射到的进程的地址空间中的虚拟内存地址.最后一个参数0用于指明要挂接的线程. 【程序编程相关:雕塑系统和辅助项目管理系统】
下面让我们来看一个例子.进程a(类似microsoft spy++的一个实用程序)安装了一个挂钩w n _ g e t m e s s a g e,以便查看系统中的各个窗口处理的消息.该挂钩是通过调用下面的s e t wi n d o w s h o o k e x函数来安装的: 【推荐阅读:如何有效的使用对话框之二】
现在让我们来看一看将会发生什么情况: 【扩展信息:J2ME国外站点】
对于一个线程来说,它可以调用s e t wi n d o w s h o o k e x函数,传递系统中的另一个线程的i d.通过为这个参数传递0,就告诉系统说,我们想要挂接系统中的所有g u i线程.
1) 进程b中的一个线程准备将一条消息发送到一个窗口.
2) 系统查看该线程上是否已经安装了w h _ g e t m e s s a g e挂钩.
3) 系统查看包含g e t m s g p r o c函数的d l l是否被映射到进程b的地址空间中.
4) 如果该d l l尚未被映射,系统将强制该d l l映射到进程b的地址空间,并且将进程b中的d l l映像的自动跟踪计数递增1.
5) 当d l l的h i n s t d l l用于进程b时,系统查看该函数,并检查该d l l的h i n s t d l l是否与它用于进程a时所处的位置相同.
如果两个h i n s t d l l是在相同的位置上,那么g e t m s g p r o c函数的内存地址在两个进程的地址空间中的位置也是相同的.在这种情况下,系统只需要调用进程a的地址空间中的g e t m s g p r o c函数即可.
... 下一页