MSAA 服务端实现

Microsoft Active Accessibility
MSAA的全称是Microsoft Active Accessibility。这是类似DCOM技术。技术模型是这样的,UI程序可以暴露出一个Interface,方便另一个程序对其进行控制。 MSAA技术的初衷是为了方便残疾人使用Windows 程序。比如盲人看不到窗口,但是盲人可以通过一个USB读屏器连接到电脑上, 读屏器通过UI程序暴露出来的这个Interface,就可以获取程序信息,通过盲文或者其它形式传递给盲人。MSAA提供了如此方便的功能, UI 自动化测试自然可以借用这项技术。MSAA暴露出来的Interface叫做 IAccessible。 测试程序和目标UI程序互操作流程如下:
1.  测试程序调用Windows API: AccessibleObjectFromWindow,传入目标UI程序HWND。
1
2
3
4
5
6
7
8
9
10
11
12
13
STDAPIAccessibleObjectFromWindow(HWNDhwnd,DWORDdwObjectID,REFIIDriid, void **ppvObject);
//hwnd[入参]
//类型:HWND
//目标窗口句柄。若要检索鼠标指针或键盘插入点光标,在此指定nullptr并在dwObjectID中使用的相应的对象ID。
//dwObjectID[入参]
//类型:DWORD
//指定对象的ID。此值是一个标准的对象标识符常量或一个自定义对象ID,如OBJID_NATIVEOM,这是Office本机对象模型的对象ID。有关OBJID_NATIVEOM的详细信息,请参阅本主题中的备注部分。
//riid[入参]
//类型:REFIID
//指定所请求的接口的引用标识符。此值是IID_IAccessible或IID_IDispatch,但它也可以是IID_IUnknown,或任何的IID接口,只要该对象支持的话。
//ppvObject[出参]
//类型:void**
//返回值。
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的细节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值