基于IAccessible接口的QQ窗口信息获取的实现

这个技术如今已经封装成DLL免费开放给你们使用了,详情请加群221487171编程

能够访问官方网站下载 http://www.guihelper.com/app

主要技术(Microsoft Active Accessibility)讲解:ide

如下是微软对于此技术的说明函数

Microsoft Active Accessibility

Version 2.0

Purpose

Microsoft® Active Accessibility® 2.0 is a COM-based technology that improves the way accessibility aids work with applications running on Microsoft Windows®. It provides dynamic-link libraries that are incorporated into the operating system as well as a COM interface and application programming elements that provide reliable methods for exposing information about user interface elements.测试

For a copy of the Active Accessibility SDK documentation formatted in Microsoft Word or WinHelp, see the Accessibility home page on MSDN.网站

Where Applicable

By using Active Accessibility and following accessible design practices, developers can make applications running on Windows more accessible to many people with vision, hearing, or motion disabilities.ui

Developer Audience

Active Accessibility is designed primarily for C, C++, and Microsoft Visual Basic® developers. In general, developers need a moderate level of understanding about COM objects and interfaces as well as about Unicode.spa

Run-Time Requirements

Full support for Active Accessibility 2.0 is built into the Windows XP and Windows Server 2003 operating systems. Active Accessibility 2.0 also supports Microsoft Windows NT® 4.0 with Service Pack 6 and Windows 98.code

MSAA的全称是Microsoft Active Accessibility。这是相似DCOM技术。技术模型是这样的,UI程序能够暴露出一个Interface,方便另外一个程序对其进行控制。 MSAA技术的初衷是为了方便残疾人使用Windows 程序。好比盲人看不到窗口,可是盲人能够经过一个USB读屏器链接到电脑上, 读屏器经过UI程序暴露出来的这个Interface,就能够获取程序信息,经过盲文或者其它形式传递给盲人。MSAA提供了如此方便的功能, UI自动化测试天然能够借用这项技术。MSAA暴露出来的Interface叫作IAccessible。测试程序和目标UI程序互操做流程以下:orm

  1. 测试程序调用Windows API: AccessibleObjectFromWindow,传入目标UI程序HWND。

  2. AccessibleObjectFromWindow函数向UI程序发送WM_GETOBJECT消息。

  3. UI程序建立实现了IAccessible的内部类,而后经过LresultFromObject API把IAccessible 接口返回给测试程序。

  4. 测试程序拿到IAccessible接口,开始调用IAccessible接口函数操做测试目标。

  IAccessible接口里面的几个关键函数是:

  IAccessible.get_accChild/ IAccessible.get_accParent经过这两个函数,调用者能够浏览目标程序的窗口关系树,定位到UI元素。

  IAccessible.accLocation/I Accessible.accHitTest读取和分辨目标元素的屏幕位置。

  IAccessible.accName/ I Accessible.accSelect读取元素的名字,对UI元素进行指定的操做,好比选取Listbox里面的某一项等等。

  IAccessible.accValue 开发人员能够自定义value属性的实现。好比针对折线图控件,开发人员能够在accValue中返回折线的坐标数列。

  MSAA的理念 相似于test hook。 经过主动让UI程序暴露一个接口来让调用者控制。 在具体使用中,测试人员每每是结合MSAA和Win32 API操做,取长补短。一方面对于UI元素丰富的属性,好比style,钩选状态,是否最大化和模拟用户输入等,继续采用Win32 API。 另外一方面用MSAA的优点来弥补Win32 API的一些不足,好比:

  因为MSAA有本身的get_accChild方法,使其控件树关系并不必定要和Win32 HWNDd关系对应一致。对于自绘窗口,虽说只有一个HWND, 可是开发人员能够经过实现IAccessible接口来实现逻辑上的层次关系。好比Excel中就能够经过IAccessible把多个cell的子 IAccessible接口暴露给调用者。

  IAccessible的实现是由开发者提供, 开发者能够灵活地根据实际状况决定方法的实现。好比前面提到了折线图控件能够返回坐标数列。对于.NET WinForm, 微软在Framework中就提供了IAccessible的默认实现,这样在具体实现中,就能够处理.NET动态维护HWND的细节。

可见这个接口主要是用于软件测试和实现特殊的UI需求所用的 , 了解到这个技术以后我就想QQ会不会也使用了这个技术实现软件的测试呢 ?

结果是确定的 , QQ的GUI也使用了这个接口 , 因此咱们能够经过这个接口获取QQ窗口内部的信息 , 并且信息很全面 , 好在.NET中已经封装好了这一接口使得这一编程过程变得比较容易 , IAccessible接口在Accessibility命名空间下

实现窗口信息的获取须要配合oleacc.dll中提供的API来进行操做 , 下面是使用到的主要的API函数名

 1 public static extern int AccessibleChildren(
 2             IAccessible paccContainer,
 3             int iChildStart,
 4             int cChildren,
 5             [Out()] [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] object[] rgvarChildren,
 6             ref int pcObtained);
 7 
 8 internal static extern int AccessibleObjectFromWindow(
 9             IntPtr hwnd,
10             uint id,
11             ref Guid iid,
12             [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);
13 
14 public static extern uint WindowFromAccessibleObject(IAccessible pacc, ref IntPtr phwnd);

 转载请注明出处 : 文章来自博客园SadlyCodes的博客 http://www.cnblogs.com/SadlyCodes

但愿你们能够经过这篇文章了解到更多的关于IAccessible接口的知识

最后附一张个人测试DEMO图:

为了防止盗图我加上了我本身的水印  若是违规请通知我  我会当即更改  谢谢

相关文章
相关标签/搜索