您的位置:首页 > 其它

聊天自动发送消息给指定的人或群

2011-10-27 09:56 148 查看
实现步骤

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: