QQ群发软件开发一:
一先确定开发方向,群发无非就是要让QQ自动发送。要实现这类运用有二个主要方式,一是通过协议就是直接按照QQ协议给服务器发信息,二是通控制QQ客户端,模拟人工发送的方式来发送。QQ协议给服务器发信息这是稳定的方式,但也是最难的方式,可以说这种方式在早期可以,但现在已不可行了。 因为QQ经过十多年的发展,其在信息安全性方面已经达到了一个高度。我们没有办法通过分析数据流得知QQ的数据协议、数据加密方式。因此这种想法只能放弃。现面前只有一条路就是通控制QQ客户端,模拟人工发送。最先想到的是模拟鼠标、键盘动作去控制QQ客户端,可是后面经过多次实践,这个方法可行性很差,软件移植性差。最后只能通过句柄与WINDOWS消息模式也来实现,即先取得QQ客户端的句柄,然后再给QQ句柄发送WINDOS消息。这种方式比单纯的鼠标、键盘脚本更为稳定,也不涉及到QQ通信协议的问题,唯一的问题是你要WINDOWS句柄、消息这类API绝对的把握 。还好本人在工作之初买有本《WINDOWS API 大全》,没有想到这本书在十多年后第一次派上了用场。
确定大方向之后, 再思考细节问题。第一个要解决的是我们怎样从众多的句柄中找到QQ进程句柄现在VS用户有SPY++这个开发辅助工具。 通过这个工具我们能查看当前状态下的所有句柄。由将QQ开启状态下通过SPY++得到的句柄列表与QQ关闭下的句柄列表进行比较,我们可以发现在QQ开启状态下多了一个类型为 “5B3838F5-0C81-46D9-A4C0-6EA28CA3E942″,句柄标题为 “qqexchangewnd_shortcut_prefix_”+”QQ NUMBER“的句柄。我们结合这个句柄的大小、位置信息可以确定这个就是QQ主程序的句柄。并且通过句柄标题”qqexchangewnd_shortcut_prefix_”+”QQ NUMBER,可以确立句柄与QQ帐 的对应关系。
const string CON_QQCLASSNAME = “5B3838F5-0C81-46D9-A4C0-6EA28CA3E942”;// QQ主程序句柄类型
const string CON_QQPRETEXT = “qqexchangewnd_shortcut_prefix_”; //QQ_prestr+QQnumber //QQ主程序标题类型
public void LoadQQ()
{
if (addmsg != null)
{
addmsg(“正在加载QQ信息…”);
}
List
foreach (QQInfo qqinfo in _qqlist)
{
qqinfo.Dispose();
}
_qqlist.Clear();
foreach (winHandle qqhandle in qqlist)
{
if (qqhandle.WinText.IndexOf(CON_QQPRETEXT) >= 0)
{
//从QQ句柄标题建立句柄与QQ帐 的一一对应关系
string qqnumber = qqhandle.WinText.Substring(CON_QQPRETEXT.Length);
if (IsQQReged(qqnumber))
{
//生成一个QQ实例
QQInfo qqinfo = new QQInfo(qqnumber, qqnumber, 0, _qqconfig.IsMessageAddName);
if (this.checkmsg != null)
qqinfo.Checkmsg = this.checkmsg;
this._qqlist.Add(qqinfo);
qqinfo.qqconfig = this.qqconfig;
}
}
}
if (addmsg != null)
{
addmsg(“QQ信息加载完成!”);
}
}
建立了QQ帐 与QQ主程序对应关系,这只是我们迈出的第一步。要实现自动发送功能,还必须通过这个主程序句柄调出对话框,并得到QQ对话框句柄,对其进行操作。
以及我们还要解决当一台电脑有多个QQ帐 登录时,QQ对话框句柄的从属问题,确定我们电脑当前已打开的句柄从属于哪个QQ主程序句柄。关于这些内容我们将在《QQ群发软件开发二》中与人家分享。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!