发送端dll
LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *p = (CWPSTRUCT *)lParam;

if (HC_ACTION == nCode && p->message  == WM_MOVE)
{
   int cTxtLen = GetWindowTextLength(p->hwnd);
   LPSTR szWndName = new char[cTxtLen+1];
   GetWindowText(p->hwnd, (LPWSTR)szWndName, cTxtLen+1); 
   SendMessage(g_hWnd,WM_DISPLAY_MSG,0,(LPARAM)szWndName);
   delete [] szWndName;
             
}
LRESULT ret = CallNextHookEx(hMessage, nCode, wParam, lParam);
return 0;}
接受端MFC
LRESULT CSystestView::OnDisplayMsg(WPARAM wParam,LPARAM lParam)
{ AfxMessageBox((LPSTR)lParam);

return 0;
}
运行总是崩溃,不知如何改?大家帮帮忙,谢谢!

解决方案 »

  1.   

    接受端蹦,还是HOOK的DLL呢?
    如果是DLL端,不好用VC调试器的话。
    你可以用Ollydbg的“断在DLL加载处”一步一步检测,确定在哪个地方蹦的。
    应该可以找到问题的地方。
      

  2.   

    有的时候是接受端,有的时候是被hook的目标
      

  3.   

    跨进程是不可以传送指针的。少量的数据传递可以用 WM_COPYDATA消息传递
      

  4.   

    楼上说的是~~~
       也不知道蹦的是哪?
    SendMessage(g_hWnd,WM_DISPLAY_MSG,0,(LPARAM)szWndName);
    后没有检测成功与否!
    AfxMessageBox((LPSTR)lParam);     //不知道有没有成功的弹出过没,搞不好问题出在这
    也没有检测lParam!
    如果发送不成功,那不就蹦了~~~~~
      

  5.   

    应该是进程内通信吧,并没有垮进程吧(全局钩子而已)
    AfxMessageBox(“ok”);倒是可以的
      

  6.   

    钩子所在dll是MFC调用的虽然钩的是其他进程,但也应该是进程内通信吧?
      

  7.   

    我指出问题啊,说的不对不要见怪啊,呵呵~~
    1。钩子dll会映射到其他进程,g_hWnd就没有用了,建议用FindWindow取得主窗口句柄
    2。发送一个字符串,请用COPYDATA消息,原因同上,不是一个进程了
    3。LRESULT ret = CallNextHookEx(hMessage, nCode, wParam, lParam);
    return 0; 应该是reutrn ret;吧?
      

  8.   

    同意楼山的,对于g_hWnd , 建议用共享数据段