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

本文介绍了如何利用Spy++和AccExplorer32.exe进行窗口抓取,并通过Windows消息处理实现基本的窗口、控件操作。详细展示了通过辅助类实现界面模拟操作,包括控件内容修改和按钮单击。实现过程包含窗口信息抓取、控件定位、消息发送等关键步骤,最终展示自动模拟操作的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文在文章开始,先介绍下窗口的抓取软件,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( null this .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, 
0 this .txtInput.Text);
                    }
                }
            }
            
int  x  =  288 ;
            
int  y  =  328 ;
            win.ClickWindow(
" left " , x, y,  false );
        }
  

 

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

 

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

 


如果要进行进一步的操作,在继续对弹出的窗口进一步分析即可,其他所有的窗口操作,原理一样,这样就可以实现很多程序的自动模拟操作,是不是很方便呢。
根据UIAutomation封装了很多自定义方法 现在只需要实例化之后 直接调用方法即可完成。比如单击某个按钮,现在只需要直接调用ClickElement,非常实用。 ClickElement 单击指定的自动化元素 DisselectAllDataGridRow 不选中所有行 DisselectDataGridRow 不选中特定的某一行 FocusWindow 获取窗口焦点 GetAllElement 获取指定父自动化元素下的所有激活的控件 GetAllElementDetails 获取指定自动化元素下的详细信息包括AutomationID,ControlType以及Name GetAllMenus 获取所有菜单项 GetAllSubMenus 获取某个菜单下的所有子菜单项 GetColumnsFromGridLine 获取指定行的所有列 GetColumnValuesFromGridLine 获取行的每一列数据 GetControlType(AutomationElement) 获取制动自动化元素的控件类型 GetControlType(TypeOfControl) 获取UIAutomation的控件类型 GetDocumentText 获取document控件的值 GetElementByID 获取父自动化元素下指定元素控件ID的引用 GetElementByName 获取父自动化元素下的指定子元素的引用 GetElementsByControlType 获取父自动化元素下的特定类型的所有自动化元素 GetGridLinesFromDataGrid 获取网格控件的全部行元素的引用 GetHeaderFromDataGrid 获取指定网格控件的标题栏引用 GetMenuBar 获取菜单栏控件 GetMenuByName 通过特定的名称去获取菜单UI自动化元素 GetName 获取指定自动化元素的名称 GetSubMenuByName 获取主菜单下的指定子菜单项的引用 GetValue 获取指定自动化元素的值 GetWindowByName(String) 获取desktop下的指定窗口名称的子UI自动化元素 GetWindowByName(String, AutomationElement) 获取特定父UI自动化元素下的制定窗口名称的子UI自动化元素 GetWindowList() 获取当前桌面根下所有的UI自动化元素下 GetWindowList(AutomationElement) 获取特定父UI自动化元素下的所有窗口的名称 RefindMainApplication 重新获取desktop下的指定窗口自动化元素引用 SelectAllDataGridRow 选中所有行 SelectDataGridRow(AutomationElement) 选中特定的某一行 SelectDataGridRow(AutomationElement, Boolean) 将特定的DateGridRow加入选中项中 SelectValueInComboBox 从下拉框中选中指定值的项 SelectValueInListBox 从列表中选中指定值的项 SetValue 给予指定自动化元素赋值 以上的方法还不是很完善 正在完善中。如果有什么意见和建议,请发送邮件获取 chenxu7601257@qq.com 如果你看了这个帮助文件之后觉得有用的,请发邮件获取,我将把dll文件给你。谢谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值