如何不使用DLL创建全局WH_GETMESSAGE类型HOOK?
请教各位,使用下面这段代码创建全局的WH_GETMESSAGE类型钩子,会失败,而其他有些类型的全局钩子则会成功,GetLastError返回的值是1428,“没有模块句柄无法设置非本机的挂接”SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,GetModuleHandle(NULL),0);请教大家如何不使用DLL创建全局WH_GETMESSAGE类型HOOK呢?

解决方案 »

  1.   

    好像处理日志钩子外,其它的全局钩子,都得dll啊
      

  2.   

    嗯,我试过其他有些全局钩子是可以不使用DLL的。
    SetWindowsHookEx第三个参数是DLL的句柄,但是原理上说是可以把自己的进程当做DLL插入的~
      

  3.   

    全局的这个,WH_GETMESSAGE,似乎只能DLL了吧,因为你的代码必须在进程的地址空间啊。
      

  4.   

    自己的进程是可以以DLL的方式共享的,有些钩子全局钩子就可以这么实现.
      

  5.   

    下面这个采用了一种共享的方法实现不使用DLL创建全局钩子,但是试过WH_GETMESSAGE还是不行:
    http://stackoverflow.com/questions/454477/global-hook-setwindowshookex
      

  6.   

    WH_KEYBOARD_LL,WH_MOUSE_LL无需dll
    WH_GETMESSAGE要用dll
      

  7.   


    >_< 我觉得原理上都应该可以把自己作为DLL插入到进程中的
      

  8.   

    windows xp是可以,但是由于exe被当做dll加载时不会执行入口点,不会处理导入表,不会处理重定位表,并且exe的入口点和dll的入口点参数不同,就算执行了入口点也会崩溃
    所以把exe自己当dll插会把别的进程插死的,所以windows vista起就把这个功能封了
      

  9.   

    注意WH_KEYBOARD_LL的hModule需要是钩子过程所在的模块,如果是exe就要传GetModuleHandle(0)