寒假时做的一个QQ消息发送器,请各位见谅,由于我=级不够,不能将整个代码和图片传上来,所以现在将它的一些核心部分的技术拿出来细讲以下,希望能对读者来一点思路,做出更好的东西。
感谢网上的所有高手将自己的经验分享出来让我做了许多的参考
感谢班主任杨老师的指导

做QQ消息发送器,最重要的是要先找到QQ聊天的窗口,然后将自己想说的话写到QQ消息发送框里,在模拟键盘输入按下“发送”的按扭,这样就可以搞定了(呵呵,是不是很简单的啊),那好,现在就让我们来动手做吧。

<1>找窗口
 想要找到QQ聊天的窗口,我们要用到2个函数FindWindowEx()和GetWindowText(),首先我们用FindWindowEx()函数找到所有桌面的窗口,当然,我们只需要QQ的聊天窗口,其他的对我们没用,FindWindowEx()只能找到一个窗口,怎么才能找到所有的窗口然后我们在去判断是不是QQ的聊天窗口呢?这就要用到vc++给我们提供的一个很好的函数GetWindow()了,让我们看看下面的代码:
HWND hwnd=FindWindowEx(NULL,NULL,"#32770",NULL);
While (hWnd != NULL)
{
   If ()
     {
        //……..
     }
Else
{
     hwnd=::GetWindow(hwnd,GW_HWNDNEXT);
}
}
用以上的代码就可以将桌面上的窗口一个一个的找到,然后我们就对一个一个的窗口的名字进行判断,如果含有”与”(因为QQ聊天窗口的名字都是”与XX聊天中”);
<2>由于桌面上的窗口按照那个Z序列放置的,如果按照找到一个窗口,发送一句话,然后在找个窗口,在发送一句话的思路回出错的(我做的时候就是这出错了,感谢我的班主任杨老师的指导使我明白了这个问题)所以我们就要想个方法避免上面哪个思路了,我在这用到了数组,在找到窗口后先保存起来,在找完所有的窗口后在集体实行发送消息
CTypedPtrArray<CObArray, CWnd*> myArray;
这句就是我创建了一个窗口的array(如果您对上面这句话不理解,请查阅MSDN)
OK
这就是整个的思想
现在我将核心代码拿来让大家看看

void CQQView::OnButton1() 
{
  // TODO: Add your control notification handler code here
        
  CTypedPtrArray<CObArray, CWnd*> myArray;
    // 这个m_edit是Edit Box窗口的一个变量,它存放您想发送的那句话
  // 如果m_edit为空,说明您还没写您想发送的话,它提示您先写上您想发送的话
    if(m_edit.IsEmpty())
    {
      MessageBox("please enter what do you want to say!!!",
             "Attention",
             MB_OK |  MB_ICONWARNING);
      return;
    }
    HWND hwnd=FindWindowEx(NULL,NULL,"#32770",NULL);
    while(hwnd)
    {
      CString string;
      char a[100];
      HWND send,pro,pro1,message;
      // 得到窗口名称
      ::GetWindowText(hwnd,a,100);
      string.Format("%s",a);
      // 如果含有"与"(因为QQ聊天窗口的名字都是"与XX聊天中");说明是QQ窗口
      if(string.Find("与")>-1)
      {
        pro=FindWindowEx(hwnd,NULL,"#32770",NULL);
        CWnd *pWnd=CWnd::FromHandle(pro);
        pro1=FindWindowEx(pWnd->m_hWnd,NULL,"AfxWnd42",NULL);
        CWnd *child=CWnd::FromHandle(pro1);
                // 找到QQ窗口的哪个写消息的文本框
        message=FindWindowEx(child->m_hWnd,NULL,"RICHEDIT",NULL);
            if(message)
            {
               CRichEditCtrl* rich
                      =  (CRichEditCtrl*)(CWnd::FromHandle(message));
               rich->ReplaceSel(m_edit);
            }
            else
            {
               return;
            }
        send=FindWindowEx(pWnd->m_hWnd,NULL,NULL,NULL);
        string="";
            while(send)
            {
              child=CWnd::FromHandle(send);
              child->GetWindowText(string);
              if(string.Find("发送")>-1)
              {
                               //加入指针数组
                myArray.Add(child);

                 send=NULL;
              }
              else
              {
                 send=FindWindowEx(pWnd->m_hWnd,send,NULL,NULL);
              }
            }
        hwnd=::GetWindow(hwnd,GW_HWNDNEXT);
      }
      else
        hwnd=::GetWindow(hwnd,GW_HWNDNEXT);
    }
        // 按照窗口数组里的窗口进行逐个发送信息
    for(int count=0;count<myArray.GetSize();count++)
    {
      CWnd* p=myArray.GetAt(count);
      p->SendMessage(BM_CLICK);
    }
        // 清空数组
    myArray.RemoveAll();
        // 将m_edit清空,因为下一次您要写上您想发送的话
    SetDlgItemText(IDC_EDIT1,"");
    m_edit="";
}