Posted on 2006-12-13 18:55
济公 阅读(765)
评论(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 ,按发送按钮之前需要打开一个聊天窗口。