什么是MSAA?
MSAA即Microsoft Active Accessibility,为在应用程序和帮助技术之间交换信息提供标准的、一致的机制。例如,MSAA允许程序把所有对象的类型、名称、位置、当前状态暴露给屏幕读者并通知屏幕读者任何windows事件导致的用户接口改变。
随着Windows Vista的发布,微软公布了新的Accessibility模型,叫UI Automation,是对MSAA的改进。
利用MSAA进行测试
TC提供对实现了IAccessible接口的窗体的扩展支持。例如,由VB、FoxPro或 Microsoft Access创建的应用程序窗体。TC使用该接口的方法和属性来获取关于窗体及其子窗体的属性信息,这样你就可以在测试过程中使用由 IAccessible接口暴露的对象、方法、属性。
TC使用MSAAObject和WaitMSAAObject方法来让脚本访问由MSAA的IAccessible接口暴露的对象、方法和属性。例如,下面脚本使用MSAAObject访问Word的menu_bar并执行该对象的鼠标事件:
Sys.Process('WINWORD').Window('OpusApp', 'Microsoft Active Accessibility Architecture.doc - Microsoft Word', 1) .MSAAObject('menu_bar').Click;来源 www.pms.cc
对于没有自动实现IAccessible接口的对象,可以在应用程序中手工加入对接口的实现。TC通过Windows API的AccessibleObjectFromWindow函数发送WM_GETOBJECT信息给请求的窗体。所以在程序中通过处理 WM_GETOBJECT信息,可以返回实现了IAccessible接口的对象的引用。这样就可在Object Browser中看到这个对象的方法和属性了。
例如,下面代码在C#中处理WM_GETOBJECT信息,返回实现了IDispatch接口(IDispatch是IAccessible的父类)的对象的引用:
// Include needed assemblies
using System;来源 www.pms.cc
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MSAAOpenApplication
{
. . .
public class Form1 : System.Windows.Forms.Form
{
// Message identifiers
private const int WM_GETOBJECT = 0x003D;
private const uint OBJID_NATIVEOM = 0x0FFFFFFF0;
. . .
// Modified window procedure. Includes code for processing WM_GETOBJECT message.
protected override void WndProc(ref Message m)
{
// Checks the message
if ((m.Msg == WM_GETOBJECT) & ((uint)m.LParam == OBJID_NATIVEOM))
{
// Obtains the GUID of the IDispatch interface
Guid g = new Guid(Win32.IID_IDispatch);
// Returns the object, which you want to obtain via MSAA
// IObjectDispatch is a reference to the IDispatch interface implemented by the desired object
m.Result=Win32.LresultFromObject(ref g, m.WParam, IObjectDispatch);
return;
}
else
{
// Calls the default window procedure
base.WndProc(ref m);
}
}
}
// Helper class needed to call Win32 API functions
public class Win32
{
// Imports the LresultFromObject function from oleacc.dll
[DllImport("oleacc.dll", CharSet=CharSet.Auto)]
public static extern IntPtr LresultFromObject(ref Guid riid, IntPtr wParam, [MarshalAs(UnmanagedType.IDispatch)] object pAcc);
// GUID of the IDispatch interface
public const string IID_IDispatch="00020400-0000-0000-C000-000000000046";
}
}