posts - 112, comments - 215, trackbacks - 0, articles - 34
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

利用Visual C++ 实现QQ消息群发

Posted on 2006-12-13 18:55 济公 阅读(749) 评论(2)  编辑 收藏 引用 所属分类: VC++

一、引言

   QQ 一直是国内最令人瞩目的及时通讯软件,近 6 年的经营使其在 IM 市场有了 " 世界第一 " 名号。在国内市场, QQ 的市场占有率已经超过了 70% ,用户群庞大,本人就是腾讯 QQ 的一个用户。不知 QQ 会员是否能够消息群发,但我这个免费用户是享受不了这个服务的,给同事和朋友们发通知好辛苦啊。在网上 Google 了一下,找到几个小软件,可是消息后面又加个广告尾巴。还是自己动手吧:

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

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

  二、具体实现

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



  第一步,找到聊天主窗口,该窗口的标题是与 ***** 聊天中,我们可以通过使用 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 (" 成都外国语学校 黄东 ");// 填上将要发送的内容

    }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
}

  至此,主要部件已经实现了,如何让程序自动为每个好友打开聊天窗口,和这个也差不了太多,就留给各位去研究吧,这条思路适合目前所有的 IM 软件。


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

 

Feedback

# re: 利用Visual C++ 实现QQ消息群发  回复  更多评论   

2006-12-15 18:58 by 我的求职信
已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...

# re: 利用Visual C++ 实现QQ消息群发  回复  更多评论   

2007-02-26 16:55 by 游子
把你做的工具和源代码放上来嘛。
只有注册用户登录后才能发表评论。