Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16498142
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:58:18

下载本文示例代码
  摘要 在Windows系统环境中,利用操作系统的消息驱动机制模拟QQ消息发送过程,实现QQ消息群发。  关键字 QQ消息群发 软件模拟 消息循环 SPY   下载本文源代码  一、引言  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,按发送按钮之前需要打开一个聊天窗口。   摘要 在Windows系统环境中,利用操作系统的消息驱动机制模拟QQ消息发送过程,实现QQ消息群发。  关键字 QQ消息群发 软件模拟 消息循环 SPY   下载本文源代码  一、引言  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,按发送按钮之前需要打开一个聊天窗口。 下载本文示例代码


利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发利用Visual C 实现QQ消息群发
阅读(213) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~