在SetWindowHookEx里面 对WH_CALLWNDPROC进行挂钩,
在回调里面 CWPSTRUCT* tg= (CWPSTRUCT*)lParam;
RECT rt;
GetWindowRect(tg->hwnd, &rt);
char* p = new char[100];
sprintf(p, "%d %d %d %d\r\n", rt.left, rt.top, rt.left, rt.bottom);
OutputDebugString(p);
delete[] p;查看调试输出,发现得到只是当前窗口(就是调用HOOK DLL的窗口,不知道怎么描述合理)的rect,即使移动其他窗口,也不会输出其他窗口的rect,是哪里出了问题么?我SetWindowHookEx的Thread参数传的0,MSDN说0代表所有存在的窗口。
难道这个hook不是全局hook么?

解决方案 »

  1.   

    传0就是全局的你调用SetWindowHookEx的代码是什么
      

  2.   

    全局钩子必须是建立另外一个DLL里边
      

  3.   


    hCallWndHook = SetWindowsHookEx(
    WH_CALLWNDPROC,
    (HOOKPROC)CallWndProc,
    hInstance,
    0
    );其中hInstance = (HINSTANCE)hModule;
      

  4.   

    在ATTACH_PROCESS时获得hModule,或者其他方式。
      

  5.   


    [email protected]
    谢谢了哈
      

  6.   

    你的HOOK SetWindowsHookEx()相关的代码是写在DLL中吗?
      

  7.   


    很遗憾,
    Hook Keyboard和Mouse可以实现全局,但是CALLWNDPROC只能对于当前进程有效。
    不知道是不是CALLWNDPROC本来这样,,,
      

  8.   


    是的
    现在的问题是,如果hook keyboard_ll 可以实现全局挂钩,
    但是CallWndProc,只能对当前进程。
      

  9.   

    你太着急了,看了楼主是要干什么吗?
    WH_CALLWNDPROC全局钩子必须要用DLL。WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_MOUSE_LL。
    This hook is called in the context of the thread that installed it.
    所以不需要dll.
      

  10.   

    我又捣鼓了一上午,还是不行,,
    我试过Keyboardhook,把WH_KEYBOARD_LL直接换成WH_CALLWNDPROC,其他什么都没变,全局就失效了,
    其中哪里还有蹊跷么?
      

  11.   

    WH_CALLWNDPROC是可以全局的,你有没有测试我给你的程序?
      

  12.   

    我又看了下,原来如此
    我在WH_CALLWNDPROC中依然响应的WM_KEYDOWN,所以拦截不到,,我SB了。。
    感谢你 列宁同志,中国人民不会忘记你的