zoukankan      html  css  js  c++  java
  • 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开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    idea 出现 java.noSuchMechodFound
    IDEA maven 多项目 出现 java 程序包找不到
    Nginx中间件使用心得(一)
    IntelliJ IDEA 2017版 编译器使用学习笔记(三) (图文详尽版);IDE快捷键使用
    IntelliJ IDEA 2017版 编译器使用学习笔记(二) (图文详尽版);IDE快捷键使用
    IntelliJ IDEA 2017版 编译器使用学习笔记(一) (图文详尽版);IDE快捷键使用;IDE多行代码同时编写
    IntelliJ IDEA 2017版 导入项目项目名称为红色
    IntelliJ IDEA 2017版 spring-boot与Mybatis简单整合
    IntelliJ IDEA 2017版 spring-boot加载jsp配置详解(详细图文实例)
    IntelliJ IDEA 2017版 spring-boot修改端口号配置把端口号改为8081
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1814278.html
Copyright © 2011-2022 走看看