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