【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 4211|回复: 0

[算法/加密解密] 利用Visual C++ 实现QQ消息群发

[复制链接]
发表于 2009-3-1 01:58:54 | 显示全部楼层 |阅读模式
QQ一直是国内最令人瞩目的及时通讯软件,近6年的经营使其在IM市场有了"世界第一"名号。在国内市场,QQ的市场占有率已经超过了70%,用户群庞大。

  如果要分析腾讯QQ协议来编写发送QQ消息是很复杂的一件事情,那么,有没有简单的办法呢?答案是肯定的:有!

  既然Windows使用消息循环来处理输入信息,那么如果我们能够用程序模拟产生"操作QQ时鼠标和键盘操作所发出的消息" ,那么就应该可以实现程序发送QQ消息,进而批量发送QQ消息,即消息群发。

  二、具体实现

  QQ给某个人发送消息时,将创建如下图所示的窗口(对话框窗口),我们发消息就是填写消息内容,然后点击发送。要模拟QQ消息发送,我们就需要填写消息内容,然后模拟按键发送。



  第一步,找到聊天主窗口,该窗口的标题是与tommy交谈中,我们可以通过使用FindWindowEx函数来找到这个窗口。

  第二步,找到输入消息的控件并在里面填写消息。注意:可能是腾讯公司为了安全,在窗口里又套了几个窗口,如果有兴趣,可以用微软的工具SPY++自己看看。通过使用SPY++观察,发现该控件是一个RichEdit类,位置如上图所示,我们还是用 FindWindowEx函数来找到它,然后取得指针,通过指针往里面些数据。




  第三步,模拟鼠标点发送按钮的操作,可以通过取得该按钮的指针,然后发送一个BM_CLICK消息就可以了。

  通过程序模拟,实现的非常好。用VC6建立一个简单的对话框程序,添加一个按钮(改Caption值为发送),为该按钮填加以下执行代码:

void CMySMSDlg:: QQSendMessage()
{
 CString str;
 CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
 while (pMainWnd)
 {
  HWND hWnd,hNext;
  hWnd = pMainWnd->m_hWnd;
  pMainWnd->GetWindowText(str);
  if(str.Find ("聊天")>-1){//找到聊天主窗口Begin
   //找RichEdit
   hWnd=FindWindowEx(pMainWnd->m_hWnd,NULL,"#32770",NULL);
   pMainWnd = CWnd::FromHandle(hWnd);
   hWnd=FindWindowEx(pMainWnd->m_hWnd,NULL,"AfxWnd42",NULL);
   CWnd* pChildWnd=CWnd::FromHandle(hWnd);
   int nLen = str.GetLength ();
   hNext = FindWindowEx(pChildWnd->m_hWnd,NULL,"RICHEDIT",NULL);
   if(hNext)
        {//找到消息填写控件
    CRichEditCtrl* pRich=(CRichEditCtrl*)(CWnd::FromHandle(hNext));
    pRich->GetWindowText (str);
    pRich->SetSel (nLen,nLen);
    pRich->ReplaceSel ("http://www.wantsoft.com");//填上将要发送的内容
   }else return;
   //找消息发送按钮
   hWnd=FindWindowEx(pMainWnd->m_hWnd,NULL,NULL,NULL);
   while (hWnd) {
    pChildWnd=CWnd::FromHandle(hWnd);
    pChildWnd->GetWindowText(str);
    if(str.Find ("发送")>-1){
     pChildWnd->SendMessage (BM_CLICK);//发送
     return;// 退出
    }
    hWnd=FindWindowEx(pMainWnd->m_hWnd,hWnd,NULL,NULL);
   }
   return;
  }//找到聊天主窗口End
  else pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT); //继续找
 }//While
}

  程序在VC6下编译通过(文件很小,只有20KB),操作系统为Windows 2000 SP4,QQ版本为2004 SP1,按发送按钮之前需要打开一个聊天窗口。也可以设置Timer自动查找窗口。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-5-22 00:00

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表