QQ群发软件开发一

来源:互联网 发布:胡歌经纪人是谁知乎 编辑:程序博客网 时间:2024/09/21 08:53

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<winHandle> qqlist = WinAPI.GetWinHandleList(CON_QQCLASSNAME);//得到QQ句柄列表
            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群发软件开发二》中与人家分享。


0 0
原创粉丝点击