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

实现步骤

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

 

你可能感兴趣的:(C++)