这个技术现在已经封装成DLL免费开放给大家使用了,详情请加群221487171

可以访问官方网站下载 http://www.guihelper.com/

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

以下是微软对于此技术的说明

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.

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.

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.

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

  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函数名

 public static extern int AccessibleChildren(
IAccessible paccContainer,
int iChildStart,
int cChildren,
[Out()] [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = )] object[] rgvarChildren,
ref int pcObtained); internal static extern int AccessibleObjectFromWindow(
IntPtr hwnd,
uint id,
ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject); public static extern uint WindowFromAccessibleObject(IAccessible pacc, ref IntPtr phwnd);

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

希望大家可以通过这篇文章了解到更多的关于IAccessible接口的知识

最后附一张我的测试DEMO图:

为了防止盗图我加上了我自己的水印  如果违规请通知我  我会立即更改  谢谢

基于IAccessible接口的QQ窗口信息获取的实现的更多相关文章

  1. 窗口信息获取器 Spy4Win v0.20b 中文绿色版

    软件名称:窗口信息获取器 Spy4Win v0.20b 中文绿色版软件类别:国产软件运行环境:Windows XP软件语言:简体中文授权方式:免费版软件大小:1.67 MB软件等级:整理时间:2012 ...

  2. 基于MSAA的QQ界面信息获取的实现

    主要技术(Microsoft Active Accessibility)讲解: 以下是微软对于此技术的说明 Microsoft Active Accessibility Version 2.0 Pur ...

  3. 界面信息获取库的封装,记有爱UI助手的诞生

    距离上次写文章已经过去了10个月,这次把我最近做的一个东西的一些心得写下来吧. 上一篇文章写了MSAA技术对于QQ界面信息获取的相关知识,近一段时间我把这个技术包括一些其他的功能做了一个封装并准备公开 ...

  4. Node.js 应用全链路追踪技术——[全链路信息获取]

    全链路追踪技术的两个核心要素分别是 全链路信息获取 和 全链路信息存储展示. Node.js 应用也不例外,这里将分成两篇文章进行介绍:第一篇介绍 Node.js 应用全链路信息获取, 第二篇介绍 N ...

  5. selenium常用操作,查找元素,操作Cookie,获取截图,获取窗口信息,切换,执行js代码

    目录: 1. 常用操作 2. 查找元素 3. 操作Cookie 4. 获取截图 5. 获取窗口信息 6. 切换 7. 执行JS代码 简介 selenium.webdriver.remote.webdr ...

  6. Android之QQ授权登录获取用户信息

    有时候我们开发的app须要方便用户简单登录.能够让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下怎样在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...

  7. swift的类型系统及类型(内存)信息获取:接口、编译运行时、反射、内存布局

    swift是静态语言,没有在运行时保存类型的结构信息(isa.class). 一.self.Self.Type.typeof extension Collection where Self.Eleme ...

  8. 基于HttpClient的新版正方教务系统模拟登录及信息获取API

    简介 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录,再获取信息.模拟浏览器正常操作,封装请求头信息获取SESSIONID.模拟登录成功后切勿断开会话,依赖登录请求得到的C ...

  9. Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid

    Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...

随机推荐

  1. 杀死当前Excel进程

    说明: 代码编写过程中,有时需要杀死当前Excel进程,而不影响其他Excel进程. 代码如下: 添加引用: //杀死当前进程的API引用 using System.Runtime.InteropSe ...

  2. The TCP three-way handshake (connect)/four wave (closed)

    TCP, relative to the SOCKET developers create process and link remove process consists of the TCP/IP ...

  3. Mac RTX

    http://bbs.weiphone.com/read-htm-tid-1876850.html 公司的rtx还是2010的,如果是2011的就有mac版的了.直接到官网下. 那还是用2010的,尼 ...

  4. Data Structure导论的导论

    DataStructure是一组互相之间存在一种或多种特定关系的数据的组织方式和它们在计算机内的存储方式,以及定义在该数据上的一组操作. 从以上定义可知,数据结构是研究数据的组织.存储方式及其操作的学 ...

  5. Drawable、Bitmap、byte[]之间的转换

    android在处理一写图片资源的时候,会进行一些类型的转换: 1 Drawable → Bitmap 的简单方法 ((BitmapDrawable)res.getDrawable(R.drawabl ...

  6. c结构体初始化问题

    结构体中的数组的初始化问题 我的代码 C/C++ code #include <stdio.h> #include <stdlib.h> struct a { int leng ...

  7. java 中的set方法和get方法的理解

    get的意思是获取,set的意思是设置. get方法和set方法是实现类的封装访问的很好的工具. 当类中的变量设为private 时,他的意思就是说,只能通过自身和子类的访问,但是对于别的其他的类来说 ...

  8. Android_life,Intent_note

    生命周期: 从出生到死亡 Activity生命周期的7个方法和3个循环 onCreate() 创建时调用onRestart() 不可见到可见时调用onStart() 用户可见时调用onResume() ...

  9. 用ModelSim仿真SDRAM操作

    之前写了两篇关于Modelsim仿真的blog,其中模块管脚的命名可能让人觉得有些奇怪,其实不然,之前的两篇内容都是为了仿真SDRAM操作做铺垫的. 由于SDRAM的仿真过程相对比较复杂,也比较繁琐. ...

  10. ADO.Net知识总结

    (一)基础知识 ADO.NET: .NET中用来向数据库提交执行SQL语句的一堆类 本机访问直接"Windows验证",但是一般项目中都是单独的数据库服务器,程序在另外一台电脑上连 ...