大家我们都知道钩子可以沟本线程的程序 和全局的
我想问下  就是如何钩住外部程序的过程
就是我获取了一个外部程序的句柄后 能否把这个句饼传给钩子过程 让他处理 谢谢
请给点思路
还有个问题 就是CWND* 指针如何转为 HWND句柄  反向又如何转 谢谢

解决方案 »

  1.   

    CWnd类有个成员变量就是窗口handle要hook外部程序的过程,那就是Function Hook了,和Windows Hook不是一回事,可以google一下API Hook相关的内容
      

  2.   

    "就是CWND* 指针如何转为 HWND句柄" :
    由CWnd获取HWnd就容易多了,因为它的一个成员m_hWnd就是所对应窗口的句柄。
    CWnd->m_hWnd,或者
    HWND=CWND->GetSafeHwnd()反过来:
     CWnd   *pWnd   =   CWnd::FromHandle(hWnd); 
      

  3.   

    _declspec(dllexport) BOOL StartHook(HWND hWnd)
    {
    DWORD threadid=GetWindowThreadProcessId(hWnd,NULL);
    trace(threadid);
    if (threadid==0)
    {
    ::MessageBox(NULL,TEXT("wrong thread"),NULL,MB_OK);
    return false;
    }
    //SetWindowsHookEx 第3个参数是自己的dll,第4个参数是想要勾住的线程ID
    g_hMessage=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,GetModuleHandle("OneFileDll.dll"),threadid);
    if (g_hMessage)
    return true;
    else
    {
    g_hMessage=NULL;
    return false;
    }
    }还有参考文档:也许对于初学太深奥了,但留着以后有用把
    这里有个例子,很不错。
    含代码 中英文 文档
    http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC%5EM%5EM/%E4%BB%A3%E7%A0%81%E6%B3%A8%E5%85%A5%E7%9A%84%E4%B8%89%E7%A7%8D%E6%96%B9%E6%B3%95.zip
      

  4.   

    这不是挺简单的嘛,3楼已经说了一种方法,还一种可以定义一个CWnd对象,调用它的Attach( hwnd ),
    但操作完成后记得调用Detach(),不然对象的释构函数会尝试去销毁窗口;