没有看到vc的错误调试很难看出来
,不过我发现2个问题。
lstrcpy(buffer,lpstring);//char buffer[128]为128的stack,当lpstring长读大于127时,你的stack肯定会有问题
buffer[number]=0;//
if ((cds.lpData=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,cds.cbData))==NULL)//新生成了内存,但是buffer的内容没有copy过去。试士这个:
char *buf=new char[lstrlen(lpstring)+1];
memset(buf,0,lstrlen(lpstring)+1);
memcpy(buf,lpstring,lstrlen(lpstring));
HWND hwnd1;
cds.dwData=1;   //初始化cds结构
cds.cbData=lstrlen(lpstring)+1;
cds.lpData = buf;if ((hwnd1=FindWindow(NULL,"apihook1"))==NULL)
  MessageBox(0,"findwindow fail","error",MB_OK);
else
   SendMessage(hwnd1,WM_COPYDATA,(WPARAM)WindowFromPoin(MousePoint),(LPARAM)&cds);
delete []buf;
return TextOutA(hdc,x, y,lpstring,number);

解决方案 »

  1.   

    先谢谢gjg(gjg)了现在确实不会弹出msdev错误对话框了,但还是不能把lpstring 参数传到我的应用程序中的编辑框中,即显示是空白的的,这是为什么呢,究竟那里出错了???????
      

  2.   

    检查一下你的SendMessage返回值,同时到你得显示程序的消息循环中的WM_COPY处理函数设个断点,只要有消息传到,一定没问题
      

  3.   

    用spy++,发现SendMessage的返回值为00000000;这是不是意味这,SendMessage出现错误呢,那应该怎么处理才行呢
      

  4.   

    而且在WM_COPYDATA的处理函数中下断点也好象不停下来,是不是说明没执行到这函数?
      

  5.   

    我就是用这个方法在接受Hook数据进程和被Hook进程间进行通讯的.
    这个方法在大部分情况下运行良好.你的问题可能是比较琐碎的小问题,应该可以解决,你可以尝试
    1)确认 hwnd1=FindWindow(NULL,"apihook1")返回的hwnd1就是你的
    CApihook1Dlg.m_hwnd, 可以用MessageBox输出调试信息
    如果hwnd1是NULL,或不是你的CApihook1Dlg的m_hwnd,则通讯必然失败.2)::SendMessage(hwnd1,WM_COPYDATA , NULL, (LPARAM) &cds );
    一定有返回值,若返回0,可以用GetLastError()进一步确认到底是什么错误3)调用::SendMessage的比较好的方式,可以参考
    // Send the string to the main dialog box
    COPYDATASTRUCT cds = { 0, lstrlen(lpstring)+1, (void*)lpstring};
    ::SendMessage(m_hwnd1,WM_COPYDATA , NULL, (LPARAM) &cds );
      

  6.   

    还是不行为什么,是不是FindWindow(NULL,"apihook1")的问题,请问我的对话框的标题是"apihook1",我想得到这个对话框的句柄,应该FindWindow(NULL,"apihook1")可以实现吧,还是这种方法不行的?
      

  7.   

    只要你真的有Wnd。,FindWindow没有错(但不会有2个把?)
      

  8.   

    你先看看,应该是细节问题,就是没有发出消息吗,用PostMessage看看(可能会丢消息),反正方法是对的。如果愿意的话,把原码发过来我帮你看看
    [email protected]
      

  9.   

    现在有新的问题了,请看看吧,谢谢了
    1。由于我在鼠标钩子函数中,在鼠标移动事件中,调用了WindowFormPoint,ScreenToClient,InvalidataRect函数,估计是WM_MOUSEMOVE消息太频繁了,不断的重绘,让系统性能下降,你可以看看apihook1对话框移动过程中重绘极为的慢就知道了,
    我想应该改为,在鼠标停下来的时候(既停在某个单词上的时候),调用InvalidataRect,让系统重绘,这样我想会减少重绘的次数,可能会好一点,但是不知道应怎么实现,在鼠标停下来,才调用InvalidataRect,让系统重绘。
    2。在应用程序中的::oncopydata()函数中,获取,snedmessage传过来的字符串,在对话框上显示,但显示消失的太快了,应该怎么样才能让对话框的字符显示延迟一段时间能?
    3。本来应该是想用系统鼠标钩子帮我把包含hook api代码的dll注入,鼠标下的窗口所在的进程,但我运行了一下,发现不能抓别的窗口的单词