既然是全局钩子,dll被映射到别的进程去了,为什么调用方进程结束后,钩子会失效呢?

解决方案 »

  1.   

    因为启动进程是这个dll的宿主,
    hMod 
    Handle to the DLL containing the hook procedure pointed to by the lpfn parameter。当这个exe关掉后,其他进程找不到这个模块的具体信息了,因为其他进程里的dll只是一个印射。如果你想驻留到整个系统,你必须找一个长期运行的exe,保证dll的真身一直存在。比如winlogon进程。
      

  2.   

    莫非你的意思是,把钩子dll注入到winlogon,让winlogon来做宿主?
    感觉确实不错,不过winlogon应该是无窗口的进程,小弟还没搞清楚是不是“全局消息钩子只能在有窗口的程序中调用”。http://topic.csdn.net/u/20081002/12/c010a69a-dd28-4fdf-8af2-ebb778c3f820.html?seed=1913519861
    谢谢
      

  3.   

    只要钩子被加载到其它进程之后,调用方进程再退出(不调用UnhookWindowsHookEx),钩子就会继续有效。
      

  4.   

    应用程序结束 就没用了 因为你的DLL宿主exe已经结束了 
      

  5.   

    个人理解,可能不正确..
    DLL被加载时有地址空间,这个地址空间在你的加载DLL的进程内,比如我有个程序HookInstall.exe,是用来安装钩子的,钩子类型为WH_KEYBOARD,
    成功安装钩子后,DLL就被映射到那些产生了KEYBOARD消息的进程中,当进程HookInstall.exe退出时,DLL的地址空间也就跟着消失了,所以钩子失效..
    不知我的理解对不对.
      

  6.   

    像线程、进程之类不是有个引用计数吗?映射进别的进程会不会类似有引用一样,有引用怎么能随便释放dll呢
      

  7.   

    如果你调用了Unhook,那么新产生的窗口将不再调用你设置的钩子,但是之前已经被钩住的钩子还在继续生效,直到所有这些被钩住的窗口都被销毁,全局钩子才完全退出,此时钩子DLL才被真正解锁卸载。
    一般在调试期间,通过DllMain函数多做一点判断,只钩住特定目标内的进程和窗口,其他的窗口都返回FALSE,以免调试结束时你的钩子DLL被锁定后无法再次编译链接,Release版本可以解除这些限制。
      

  8.   

    只要钩子被加载到其它进程之后,调用方进程再退出(不调用UnhookWindowsHookEx),钩子就会继续有效。
    ===================
    这个好像不对,当调用方进程结束之后,这个钩子都不再起作用了。我以前也产生过疑问的