【咨询】关于程序实现向QQ好友或MSN好友群发消息的问题!

jscn123789abc 2008-11-22 12:01:01
大家好啊!
我想请教个问题:就是如何实现向QQ好友或MSN好友群发消息的问题?
主要是在周末或一些特殊节日向好友群发祝福的消息,并不是用来发无聊的广告。

在网上看了一些这方面的资料:
大概都是通过句柄、窗体名、类名来遍历所有好友的聊天文本框,
好象功能不容易实现,可能主要是窗体名、类名找不到,
请做过这方面程序的朋友讨论一下,谢谢啦。。。
...全文
435 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsdhust 2008-11-26
  • 打赏
  • 举报
回复
nra
zzz822163 2008-11-26
  • 打赏
  • 举报
回复
还是需要自己打开窗口呀?
我以为你想搞让他自动打开窗口发消息呢
jscn123789abc 2008-11-25
  • 打赏
  • 举报
回复
up up ...
jscn123789abc 2008-11-25
  • 打赏
  • 举报
回复
请高手帮忙分析以下下面的解决方案,谢谢...

其它功能就不详细说了,这里只给大家把主要的地方将一下。
1、查找当前的所有聊天窗口。
QQ两天窗口的特点都是以******交谈中,而群则是***-群,所以只要找到所有窗口然后判断窗口标题就行了。
::EnumWindows(EnumWindowsProc_1,0) ; //需要时调用就行了
//下边这个函数必须是全局的
BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam)
{
char lpWinTitle[256];
CString m_strTitle;
::GetWindowText(hwnd,lpWinTitle,256-1);
m_strTitle.Format("%s",lpWinTitle);
if(m_strTitle.Find("交谈中")!=-1||m_strTitle.Find("群")!=-1)
{
strcat(chTitle[i],m_strTitle);
i++;
}
return TRUE ;
}

2找到聊天窗口中输入内容的RichEdit控件的HWND和发送按钮的HWND
//这个函数也必须是全局的
BOOL CALLBACK EnumChildWindowsProc_1(HWND hwnd,LPARAM lparam)
{

if(hwnd)
{
char m_strClass[256];
char m_pstr[256];
char lpWinTitle[256];
HWND phwnd;
::GetClassName(hwnd,m_strClass,255);
::GetWindowText(hwnd,lpWinTitle,256-1);
phwnd=::GetParent(hwnd);
::GetClassName(phwnd,m_pstr,255);
if (!strcmp(m_strClass,"RichEdit20A")&&!strcmp(m_pstr,"AfxWnd42"))
msgHWND[k++]=hwnd;
if(!strcmp(m_strClass,"Button")&&!strcmp(lpWinTitle,"发送(S)"))
btnHWND[k]=hwnd;
return TRUE;
}
else
return FALSE;

}
//下边这个函数使用时调用就行了
::EnumChildWindows(childHWND,EnumChildWindowsProc_1,0);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
对于上边的代码,我想大家用spy++查看一下就知道了,QQRichEdit是嵌套了一层的,上边的传输消息的也叫RichEdit,只是父窗口不一样而已。
3像这些HWND发送消息
::SendMessage(msgHWND[j],EM_REPLACESEL,0,(LPARAM)m_text.GetBuffer(m_text.GetLength()));
::SendMessage(btnHWND[j],BM_CLICK,0,0);
至于问什么不用WM_PASTE大家试试就知道了,QQ把这个消息给屏蔽了,所以要用EM_REPLACESEL。
对于PostMessage,经测试没发送成功,大家可以试试,说不定是我哪搞错了。
QQ自动发消息打注意内容也就这些了,大家可以自己完善一下。
jscn123789abc 2008-11-23
  • 打赏
  • 举报
回复
//#include <afxtempl.h>
void CQQqunfaDlg::OnButton1()
{
CTypedPtrArray<CObArray, CWnd*> myArray;

// 这个m_edit是Edit Box窗口的一个变量,它存放您想发送的那句话
// 如果m_edit为空,说明您还没写您想发送的话,它提示您先写上您想发送的话
UpdateData(true);

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); //pro值为0x00000000
CWnd *pWnd=CWnd::FromHandle(pro);
pro1=FindWindowEx(pWnd->m_hWnd,NULL,"AfxWnd42",NULL); //pro1值为0xcccccccc
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="";

MessageBox("Over OK!!!","Attention",MB_OK | MB_ICONWARNING);
}

********************************************开启一个好友的聊天窗口,
设置断点行,pro=FindWindowEx(hwnd,NULL,"#32770",NULL);
运行到代码行pro1=FindWindowEx(pWnd->m_hWnd,NULL,"AfxWnd42",NULL);
时提示无法预知的错误,然后继续调试就又出现下面的错误信息:

"0x00401efa"指令引用的内存。该内存不能为"read"。
要终止程序,请单击"确定"。
要调试程序,请单击"取消"。

请朋友帮忙看一下,谢谢啦。。。
xyzyaoshunyu 2008-11-23
  • 打赏
  • 举报
回复
当焦点在QQ聊天框或者MSN聊天框上的时候,可以直接利用复制,粘贴发送信息的。
所以可以在程序中,把你要发送的内容写到剪贴板里,然后copy到qq或msn的窗体中,实现跨进程通信。
jjaikaikai 2008-11-22
  • 打赏
  • 举报
回复
是通过服务器中转的,与一般C/S结构有所不同,请看拓扑图
zzz822163 2008-11-22
  • 打赏
  • 举报
回复
关注一下,不知道你的难点在哪里?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧