QQ窗口抓取及如何进行自动化操作

本文在文章开始,先介绍下窗口的抓取软件,Spy++及AccExplorer32.exe,前者是大名鼎鼎的微软出品,几乎可以抓取所有的Windows窗口及控件(其实也是一个窗口),另外一个也是类似,功能可以互补一下。

首先看看两者的界面,在抓取QQ的【查找联系人/群/企业】的窗口时候的情况:

 
Sp++的界面

 
AccExplorer32.exe界面

两者界面不同,不过基本功能有重叠,Spy++提供的功能可能会更多一些,这两个软件都可以对列出的窗口进行一系列的操作,如可以找到相关的窗口信息,窗口位置,以及对各种窗口操作的信息,包括鼠标、键盘等一系列的操作都可以模拟出来,非常强大。 

为了模拟抓取窗口以及对窗口的各种操作,我们可以通过FindWindow和FindWindowEx、SendMessage、PostMessage等Windows消息来进行处理,便可实现基本的窗口、控件操作,另外按钮的操作,我们则可以模拟鼠标单击某个坐标点的方式实现按钮的单击操作模拟。 模拟的QQ界面窗口如下所示,是一个查找窗口的。

 

我们通过抓取窗口信息,我们看到该窗口下面只有两个可见窗口,分别对应两个输入控件,可以发现该窗口的一个输入(账号和昵称输入框中的任何一个)的Class 名称如下所示:

 

首先我们来创建一个界面,如下所示,用来模拟相关的操作。

 

我们在辅助类中定义几个函数用来实现窗口的操作 

         [DllImport("user32.dll")]

        private static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childAfter, string className, string windowName);

        [DllImport(
"user32.dll", EntryPoint = "FindWindow")]
        
private static extern IntPtr FindWindowWin32(string className, string windowName);

        [DllImport(
"user32.dll ")]
        
public static extern int GetClassName(IntPtr hWnd, [Out] StringBuilder className, int maxCount);

        [DllImport(
"user32.dll")]
        
private static extern int SendMessage(IntPtr window, int message, int wparam, int lparam);

        [DllImport(
"user32", CharSet = CharSet.Auto)]
        
private extern static int SendMessage(IntPtr hWnd, int wMsg, int wParam, string lpstring);

        [DllImport(
"user32.dll")]
        
private static extern int PostMessage(IntPtr window, int message, int wparam, int lparam);

     

 

 

在实际的按钮操作代码中,我们简化了具体的操作,只需要调用辅助类就可以了

         private void btnSearch_Click(object sender, EventArgs e)

        {
            Win32Window win 
= Win32Window.FindWindow(nullthis.txtWindowName.Text);
            
if (win != null)
            {
                ArrayList list 
= win.Children;
                
foreach (Win32Window sub in list)
                {
                    
if (sub.Visible && sub.ClassName == "ATL:30A4D1D8")
                    {
                        sub.SendMessage(WindowMessage.WM_SETTEXT, 
0this.txtInput.Text);
                    }
                }
            }
            
int x = 288;
            
int y = 328;
            win.ClickWindow(
"left", x, y, false);
        }

 

 

其中位置信息时通过Spy++监控出来的信息。

 

最后结果如下所示,实现控件内容的修改,并执行了单击按钮的操作,弹出添加好友确认信息。

 


如果要进行进一步的操作,在继续对弹出的窗口进一步分析即可,其他所有的窗口操作,原理一样,这样就可以实现很多程序的自动模拟操作,是不是很方便呢。

 

主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
专注于Winform开发框架、WCF开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪  http:
//www.iqidi.com 
    
标签: 开发辅助

posted on 2010-08-31 23:59 伍华聪 阅读(3178) 评论(14) 编辑 收藏

评论

#1楼  回复 引用 查看   

呵呵 支持下。
2010-09-01 06:59 | IT鸟      

#2楼  回复 引用 查看   

那么对飞信的操作也可以了呢
2010-09-01 07:33 | hxm      

#3楼[楼主]  回复 引用 查看   

此操作对各种窗口几乎都适用,QQ窗口的应用只是其中之一
2010-09-01 08:53 | 伍华聪      

#4楼  回复 引用 查看   

记得以前有个工作叫winrunner(目前版本情况不太清楚),也能做LZ所说的这些测试操作,LZ不妨体验一下
2010-09-01 09:08 | 代震军      

#5楼  回复 引用 查看   

非常好,我喜欢。谢谢
2010-09-03 08:49 | Mars.Chen      

#6楼  回复 引用 查看   

很好!完善下就更好了。。
2010-09-05 01:36 | 堕落的青春      

#7楼  回复 引用 查看   

如果窗口大小改变了怎么办呢?
2010-09-05 08:20 | 蒋伟      

#8楼  回复 引用 查看   

不错,学习一下。谢谢分享。
2010-09-05 22:17 | 质变      

#9楼[楼主]  回复 引用 查看   

@蒋伟
一般向QQ这样的产品,用户界面变化不会很大,实在是变化,那么重新查找一下位置就可以了,不麻烦的。
2010-09-06 08:47 | 伍华聪      

#10楼  回复 引用 查看   

Win32Window win = Win32Window.FindWindow

这个是引用了哪个DLL文件啊?
2010-09-06 10:39 | 渊渊其渊      

#11楼  回复 引用 查看   

GOOD
2010-11-24 12:48 | WCF技术联盟      

#12楼  回复 引用 查看   

@蒋伟
用White core,直接获得控件。进行模拟操作
2011-08-15 00:06 | suriyel      

#13楼  回复 引用 查看   

@渊渊其渊
同求,并请教
ArrayList list = win.Children;
怎么获得的。
Win32Window该是个自己写的类吧
2011-08-15 00:07 | suriyel      

#14楼[楼主]  回复 引用 查看   

@suriyel
是的,自己封装对Windows的操作类
2011-08-15 08:48 | 伍华聪      

导航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

公告

昵称:伍华聪
园龄:6年7个月
荣誉:推荐博客
粉丝:655
关注:22

搜索

 

常用链接

最新随笔

我的标签

随笔档案(199)

文章分类(14)

文章档案(15)

相册

我的好友

我的技术支持站点(http://www.iqidi.com)

积分与排名

  • 积分 - 622553
  • 排名 - 79

最新评论

阅读排行榜

评论排行榜

推荐排行榜