C# 实现IAccessible学习(一)

来源:互联网 发布:windows网络发现服务 编辑:程序博客网 时间:2024/05/29 08:15

简介

MSAA的全称是Microsoft Active Accessibility。这是类似DCOM技术。
UI程序可以暴露出一个Interface,方便另一个程序对其进行控制。 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的细节。
      QQ的GUI也使用了这个接口 , 所以我们可以通过这个接口获取QQ窗口内部的信息 , 而且信息很全面。

主要函数

IAccessible::get_accChild/ IAccessible::get_accParent通过这两个函数,调用者可以浏览目标程序的窗口关系树,定位到UI元素。IAccessible::accLocation/I Accessible::accHitTest读取和分辨目标元素的屏幕位置。IAccessible::accName/ I Accessible:: accSelect读取元素的名字,对UI元素进行指定的操作,比如选取Listbox里面的某一项等等。IAccessible::accValue 开发人员可以自定义value属性的实现。比如针对折线图控件,开发人员可以在accValue中返回折线的坐标数列

参考引用:
http://www.cnblogs.com/GnagWang/archive/2010/04/20/1716006.html
https://msdn.microsoft.com/en-us/library/dd318466(VS.85).aspx

0 0
原创粉丝点击