被HOOK的程序:使用MFC4.2编写的windows程序A
被HOOK的对象:某一RichText控件
被HOOK的消息:WM_SETTEXT问题:
1.利用了有关方法得到了控件的hwnd,并安装HOOK后,发现A程序中的所有WM_SETTEXT消息被HOOK了。并不能如同SPY++一样,只截获该控件的WM_SETTEXT。
2.每次均截获两个WM_SETTEXT消息,即处理之前与处理之后均发送该消息,如果才能做到只在处理之后(或后)截获该消息。
3.《深入浅出MFC》第二版曾提到:MFC的消息传递归根结底也是使用了HOOK,请问,如果我们再来HOOK其消息,会不会有何影响?
4.根据《WINDOWS核心编程》,WM_SETTEXT消息的处理与其它消息处理是不同的,试问,这会不会对我们的HOOK工作造成影响。备注:
这个问题,我可以给1000分,我在广州,如果解决人在广州,我可以请他吃饭。
呵呵。金钱诚可贵,知识价更高啊。

解决方案 »

  1.   

    1 你必须自己处理。判断 hwnd,如果是,就处理 WM-SETTEXT 消息。
    2
    3 当然有影响,如果我说没有影响,你相信吗?具体有什么影响看MSDN中关于 hook 的说明。
    4
      

  2.   

    谢谢楼上的。其实对于HOOK这个问题大家已经讨论得比较多了,但大多局限于键盘、普通消息之类的,由于在实际工作中遇到了这样一个问题,所以希望高手们能多帮忙。
    对于4. WM_SETTEXT的东西传递主要是通过临时的内存映射文件来实现的。
      

  3.   

    1 用HOOK只能得到所有的消息,要得到某一控件的消息可以子类该控件或根据句柄判断
    2 可以设置标志量 初始化:i=0;在消息处理阶段: i++; if(i==1) {消息发送前;}
    else { i=0;消息发送后;}
    3 我想MFC消息传递归根结底并不是用了HOOK,而是用了子类化(个人观点,我记得《深入浅出MFC》好像也是这么说。但记得不清楚。)CWnd::SubclassWindow可以实现子类化。
    4 我想是不会有任何影响的
    希望你给分的承若要实现喔^-^
      

  4.   

    1,需要判断richedit的句柄
    2,这个问题嘛,需要人为判断
    3,会有影响,如果你在消息到达之前修改了消息,你想会怎样?
    4,WM_SETTEXT消息的处理与其它消息处理是不同的?
       有什么不同阿?接分哦:)
      

  5.   

    这两天,我把程序的雏形写出来了。但在XP下运行,如果没有HOOK就可以正常运行,如果加入HOOK,原程序A就会报错,就A内存违规访问。楼上的,如果这个问题,真如你讲的这么简单的话,我想我也没会在这里说这个大话了。呵呵。
    WM_SETTEXT消息的处理,至少有一点:他是使用临时的内存映射文件来实现数据传递的。呵呵。有机会看看我上面提到的那两本书。
      

  6.   

    1,2. 你只有钩到消息以后自己再作判断!
    3. 其实不是说mfc的消息传递最终是用hook, 而是说windows的消息传递最终也是用的hook.如果你处理不当确实会对系统造成影响, 钩子是后安装的钩子优先, 所以你自己的钩子要比你被钩的程序先得到消息, 如果在你的处理函数中不向下传递的话, 应用程序根本收不到消息了.
    4.钩子本身肯不会有什么影响(因为spy已经证明了), 就看你自己怎么处理了.
      

  7.   

    #pragma data_seg (".shared")
    HWND g_hWnd = 0; // control containing the password
    HHOOK g_hHook = 0;
    UINT WM_HOOKSPY = 0;
    char ch[1024] = { '\0'};#pragma data_seg ()#pragma comment(linker,"/SECTION:.shared,RWS") //省略#define pCW ((CWPSTRUCT*)lParam)
    LRESULT HookProc (
      int code,       // hook code
      WPARAM wParam,  // virtual-key code
      LPARAM lParam   // keystroke-message information
      )
    {
    if( pCW->message == WM_SETTEXT ) {
    if (pCW->hwnd == g_hWnd) {
    ::MessageBox(g_hWnd, ,(LPCSTR)pCW->lParam, NULL, MB_OK);
    }
    }
    return ::CallNextHookEx(g_hHook, code, wParam, lParam);
    }这是DLL中的关键部分
    在WINDOWS2000下运行没有问题,但在WINDOWS Xp运行,总是报程序A(即被HOOK的程序)在0X000004处不能读取。所以我想可能是共享段出了问题。通过跟踪,问题可能出在g_hHook上。是不是XP和WIN2000在内存管理上有不同呢?
    此外,我想把,(LPCSTR)pCW->lParam传回到自己的程序,对文本进行进一步处理,大家能给点思路吗?感谢楼上各位对我的问题的支持!
      

  8.   

    to Oldyig(沒有花香):
    对一个窗口的子类化并不要原码,只要你有窗口的句柄,就可以子类化它
      

  9.   

    你在调用HHOOK SetWindowsHookEx(
      int idHook,        // hook type
      HOOKPROC lpfn,     // hook procedure
      HINSTANCE hMod,    // handle to application instance
      DWORD dwThreadId   // thread identifier
    );
    函数时最后一个参数是不是传入了0??
    那样的话就勾住了所有GDI线程!!!!!
    得到那个程序主线程的ID号,只勾住这一个线程。
      

  10.   

    还有,你得到控件的hwnd有什么用呢??
    SetWindowsHookEx(
      int idHook,        // hook type
      HOOKPROC lpfn,     // hook procedure
      HINSTANCE hMod,    // handle to application instance
      DWORD dwThreadId   // thread identifier
    );
    函数要的是这个控件所在程序的主线程ID号!!!!!!!
    这样才能勾住这一个线程。
      

  11.   

    这个问题不用操心,我传入的是该控件的进程号。目前已经做到了
    MessageBox()能显示出正确的文本,我现在需要解决的还是那几个老问题。
    以及:在WINDOWS2000下运行没有问题,但在WINDOWS Xp运行,总是报程序A(即被HOOK的程序)在0X000004处不能读取。所以我想可能是共享段出了问题。通过跟踪,问题可能出在g_hHook上。是不是XP和WIN2000在内存管理上有不同呢?
    此外,我想把,(LPCSTR)pCW->lParam传回到自己的程序,对文本进行进一步处理,大家能给点思路吗?
      

  12.   

    其中对于原题中的第1点和第2点,在我的程序中已经可以给出答案了:if (pCW->hwnd == g_hWnd) {
                      ...............................
    }
      

  13.   

    可以使用WM_COPYDATA
    把(LPCSTR)pCW->lParam传回到自己的程序,对文本进行进一步处理//發送:
    #define MY_DATA  MAKELONG( MAKEWORD('M', 'Y'), MAKEWORD('D', 'T') )
    CWnd* pWnd = CWnd::FindWindow( NULL, "你窗口的標題" );
    if (pWnd)
    {
        COPYDATASTRUCT cds;
        cds.dwData = MY_DATA;
        cds.lpData = pCW->lParam;
        cds.cbData = nCount;    CWinApp* pApp = ::AfxGetApp();
        HWND hWndSend;
        if (pApp)
    hWndSend = pApp->m_pMainWnd->GetSafeHwnd();    pTraceWin->SendMessage( WM_COPYDATA, (WPARAM) hWndSend, (LPARAM) &cds );
    }//接收:
    afx_msg LRESULT OnCopyData( WPARAM wParam, LPARAM lParam );
      

  14.   

    感谢楼上兄弟相处,现在还乘最后一个问题就是:
    在WINDOWS2000下运行没有问题,但在WINDOWS Xp运行,总是报程序A(即被HOOK的程序)在0X000004处不能读取。
      

  15.   

    你把你的程序在xp中重新编译一边试试,按道理讲不应该出现象你说的那种问题啊,我做的每一个钩子都可以运行在xp下面啊,它个2000的运行机制是一样的呀,另外你把这一句#pragma comment(linker,"/SECTION:.shared,RWS") 删掉,到def文件中用SECTIONS shared READ WRITE SHARED替换掉试一下
      

  16.   

    窗口是一个创建它的窗口线程或装了hook的线程所有的。
      

  17.   

    呵呵,搞定了,主要是这一句程序的原因:主要是我的机器上我的朋友装了一个监控程序,想和我开玩笑,没想到被我发现了。但我也发现金山词霸等使用了相同技术的程序也会对ms.net2003造成影响了,我升级了SP2问题也是存在的。
    对于4.其实WM_COPYDATA和WM_SETTEXT等涉及部分消息都由系统自己,在底层使用临时内存映射文件进行处理,只要我们不干涉其运行,应该不会有太大的问题。