实现步骤
1、首先用SPY++获取聊天主程序的句柄。
2、通过获得的句柄查找systreeview的句柄
3、在聊天程序中开辟一个内存空间,用来接受返回的消息
4、发送消息来获取systreeview的信息,并取得指定人物或群的名称
5、模拟鼠标双击,弹出对话框。
6、用SPY++获取对话框的句柄(不同的人或群,对话框的句柄是不一样的,不过都有规律,例如“与XX对话中”,这样只要改变XX的值就可以)。
7、通过得到的句柄,来查找出聊天的编辑框(一般为 RichEdit);
8、发送消息,将要发送的聊天内容传到编辑框中。
9、模拟鼠标点击发送按钮。(当然,发送按钮句柄也需要用SPY++查找获得,在此省略)。
以下是以飞秋为例子的主要实现代码:
//开辟内存空间,发送消息,并查找指定群,双击弹出对话框
BOOL CremindDlg::GetTalkDialog()
{
HTREEITEM fan;
hTree = FindChildHwnd(hMain,0x000004a6,0x00000204);
fan = TreeView_GetFirstVisible(hTree);
TV_ITEM *ptvitem,tvitem;
char *pitem,cBuf[512];
CString buf;
DWORD pid;
GetWindowThreadProcessId(hTree,&pid);
HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS,true,pid);
ptvitem = (TVITEM*)::VirtualAllocEx(handle,NULL,sizeof(TVITEM),MEM_COMMIT, PAGE_READWRITE);
pitem = (char *)::VirtualAllocEx(handle,NULL,16,MEM_COMMIT, PAGE_READWRITE);
while(1)
{
//开辟一个进程内存空间
tvitem.mask = TVIF_TEXT;
tvitem.cchTextMax = 512;
tvitem.pszText = pitem;
tvitem.hItem = fan;
::WriteProcessMemory(handle,ptvitem,&tvitem,sizeof(TVITEM),NULL);
::SendMessage(hTree,TVM_GETITEM,0,(LPARAM)ptvitem);
//得到的名称,存放在cBuf中
::ReadProcessMemory(handle,(LPVOID)pitem,(LPVOID)cBuf, 512, NULL);
if (strcmp(cBuf,"饭~团")==0)
{
BOOL bSel=(BOOL)::SendMessage(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)fan);
::SendMessage(hTree,WM_LBUTTONDBLCLK,0,MAKELONG(5,11));
///此时已经弹出窗口 需要释放内存
VirtualFreeEx(handle,ptvitem,0,MEM_RELEASE);
VirtualFreeEx(handle,pitem,0,MEM_RELEASE);
CloseHandle(handle);
handle = NULL;
return TRUE;
}
else
{
//如果查找的名称不符合,继续查找下一个
fan = TreeView_GetNextVisible(hTree,fan);
if(!fan)
{
return FALSE;
}
}
}
return TRUE;
}
//////////////////////////向对话框中写入聊天内容,并发送
BOOL CremindDlg::SendTalk()
{
HWND hChild1,hButton;
hSendDlg = (HWND)::FindWindow(NULL,_T("饭~团 - 群(3306304801)"));
hChild1 = FindChildHwnd(hSendDlg,0x00000480,0x50011144);
hButton = FindChildHwnd(hSendDlg,0x00000400,0x5001000b);
char str[500];
///m_name为要发送的内容
strcpy(str,m_name);
::SendMessage(hChild1,WM_SETTEXT,NULL,(LPARAM)(void*)(&str));
Sleep(20);
::SendMessage(hButton,WM_LBUTTONDOWN,0,0);
::SendMessage(hButton,WM_LBUTTONUP,0,0);
return TRUE;
}
HWND CremindDlg::FindChildHwnd(HWND hp,long C_ID,long C_Sty)
{
info C_info;
C_info.ID = C_ID;
C_info.Sty = C_Sty;
EnumChildWindows(hp,(WNDENUMPROC)EnumChildProc,(LPARAM)(void*)(&C_info));
return hChild;
}
///////////////程序中还需要用到一个回调函数来获取systreeview中ITEM的属性
BOOL CALLBACK CremindDlg::EnumChildProc(HWND hwnd,LPARAM lParam)
{
long id,sty,g_id,g_sty;
id = ((pinfo)(void*)lParam)->ID;
sty = ((pinfo)(void*)lParam)->Sty;
g_id = GetWindowLong(hwnd,GWL_ID);
g_sty = GetWindowLong(hwnd,GWL_EXSTYLE);
if (id == g_id)
{
hChild = hwnd;
return FALSE;
}
}
源代码下载
http://download.csdn.net/detail/ff313976/3723817