具体实施方式
示例性操作环境
图1阐述了本发明可在其中实现的适当计算系统环境100的示例。该计算系统环境100仅是适当计算环境的一个示例,并非旨在提出对本发明使用范围或功能性的任何限制。计算环境100也不应被解释为对示例性操作环境100中所示的任一组件或其组合有任何依赖性或任何需求。
本发明可以计算机可执行指令的一般上下文进行说明,诸如由计算机执行的程序模块。通常,程序模块包括执行具体任务或实现具体抽象数据结构的例程、程序、对象、组件、数据结构等等。此外,本领域技术人员可以理解本发明可在其它计算系统配置中实践,包括手持式装置、多处理器系统、基于微处理器的系统或可编程电器消费品、迷你计算机、大型计算机等等。本发明还可在任务由经通信网络连接的远程处理设备执行的分布式计算环境中实践。在分布式计算环境中,程序模块可置于包括存储器存储设备的本地和远程计算机存储介质。
参照图1,实现本发明的示例性系统100包括计算机110形式的通用计算设备,计算机110包括处理单元120、系统存储器130以及把包括系统存储器在内的各种系统组件耦合到处理单元120的系统总线121。
计算机110通常包括各种计算机可读介质。作为示例,而非限制,计算机可读介质可包括计算机存储介质和通信介质。系统存储器130包括诸如只读存储器(ROM)131和随机存取存储器(RAM)132的易失和/或非易失存储器形式的计算机可读介质。包含有助于计算机110如起动时在元件间传送信息的基本例程的基本输入/输出系统(BIOS)133通常存储在ROM 131中。RAM 132通常包含可被处理单元120立即访问和/或现时操作的数据和/或程序模块。作为示例,而非限制,图1示出了操作系统134、应用程序135、其它程序模块136、和程序数据137。
计算机110还可包括其它可移动/不可移动、易失/非易失计算机存储介质。作为示例,图1图示了读取和写入不可移动、非易失磁性介质的硬盘驱动器141,读取和写入可移动、非易失磁盘152的磁盘驱动器151,读取和写入可移动、非易失光盘156,诸如CD-ROM或其它光学介质的光盘驱动器155。其它也用在示例性计算环境中的可移动/不可移动、易失/非易失计算机存储介质包括,但不限于,如磁带、闪存卡、数字化通用盘、数字化录像带、固态RAM、固态ROM等等。硬盘驱动器141通常通过诸如接口140的不可移动存储器接口与系统总线121连接,而磁盘驱动器151和光盘驱动器155通常通过诸如接口150的可移动存储器接口与系统总线121连接。
如上所述并如图1所示的盘驱动器及其相关联的计算机存储介质为计算机110提供计算机可读指令、数据结构、程序模块、和其它数据的存储。在图1中,例如,硬盘驱动器141被示为存储操作系统144、应用程序145、其它程序模块146、和程序数据147。注意这些组件可以与操作系统134、应用程序135、其它程序模块136、和程序数据137相同或不同。在此给予操作系统144、应用程序145、其它程序模块146、和程序数据147的不同的标记至少说明它们是不同的副本。用户可通过输入装置如键盘162和通常指为鼠标、跟踪球或触摸板等的定位装置161向计算机110输入命令和信息。其它输入装置(未示出)可包括话筒、游戏杆、游戏垫、卫星接收器、扫描仪等等。这些和其它输入设备常常通过与系统总线耦合的用户输入接口160与处理单元120相连,但也可通过诸如并行端口、游戏端口或通用串行总线(USB)的其它接口来与总线结构连接。监视器191或其它类型的显示设备也可通过诸如视频接口190的接口与系统总线121相连。除了监视器,计算机还可包括诸如扬声器197和打印机196的其它输出设备,它们通过输出外围接口190相连。
本发明中的计算机110可以在使用与一台或多台远程计算机,诸如远程计算机180的逻辑连接的网络化环境中运行。远程计算机180可以是个人计算机,而且通常包括上述与个人计算机110相关的许多或全部组件,尽管在图1中仅示出存储器存储装置181。图1中所描绘的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但也可包括其它网络。
当用于LAN网络化环境中时,计算机110通过网络接口或适配器170与局域网171连接。当用于WAN网络化环境中时,计算机110通常包括调制解调器172或其它用于在广域网173,诸如因特网中建立通信的装置。可以是内置式或外置式的调制解调器172与系统总线121通过用户输入接口160或其它适当机制连接。在网络化环境中,与计算机110相关的程序模块或其一部分可存储在远程存储器存储装置中。作为示例,而非限制,图1示出了驻留于远程计算机180中的远程应用程序185。应当理解,所示网络连接是示例性的,且其它用于在计算机间建立通信连接的技术也可以使用。
尽管未示出计算机110的许多其它内部组件,本领域技术人员将理解这种组件和相互连接是众所周知的。因此,不需要结合本发明揭示有关计算机110内部构架的其它细节。
可存取性系统结构
如图2所示,可存取性系统200与客户机环境300及服务器环境400交互。可存取性系统可在参照图1如上所述的计算机环境100中实现。可存取性系统200包括用来推动与客户机300交互的客户机侧可存取性接口220、便于与服务器400交互的服务器侧可存取性接口230、以及可存取性系统内核201。本发明的可存取性系统200提供用来可编程地访问用户接口(UI)的新的应用程序接口(API)、接口、及隐喻(metaphor)。可存取性系统200使应用程序能让自己及其所使用的任何组件变得可访问。
较佳的是,客户机环境300包括辅助技术(AT)产品或自动化UI测试工具。服务器侧400可实现各种不同技术,如图2所示。服务器系统410包括适配器412和内核414(可在第一类UI中找到)。服务器系统420包括代理服务器组件422和控制424(可在诸如华盛顿州Redmond微软公司的微软操作系统产品所提供的Win32 UI的第二类UI中找到)。服务器系统430包括适配器432和内部OM 434(可在第三类UI中找到)。
如图3所示,在可存取性系统200中所包括的事件机制210,取决于用来推动客户机环境300和服务器环境400间交互的UI自动客户机202和UI自动服务器204。UI自动客户机202和UI自动服务器204将参照本发明的事件机制210在下面作更详细地描述。本发明的可存取性系统200给予客户机(AT产品)300的能力是:(1)收集有关应用程序用户接口的信息;(2)无论哪种用于建立UI的技术都能可编程地发现和询问UI元素;(3)产生键盘和定位设备输入;以及(4)了解当前可提供的是哪类行为或功能。可存取性系统200使应用程序能让自己及其组件变得可访问。如图2和3所示的结构启用可存取性系统200的五个主要方面,包括:(1)逻辑UI树;(2)控制模式;(3)事件机制;(4)输入API(未包括在本文档中);以及(5)属性。
UI访问逻辑树222
可存取性系统200的必备组件是逻辑树222,其示例如图4(D)所示。树222可包括在客户机侧可存取性接口220中。
逻辑树222是UI元素的下层结构化层次的经过滤视图,而不是必须由控制或应用程序开发者实现的独立树。相反,它切断了一些明确定义的感兴趣及不感兴趣的属性,这些属性指示了一结构化元素是否应当在逻辑树222中展现。可存取性系统内核201使用该信息以产生经过滤UI逻辑树222,而该树随后可展现给AT产品或测试脚本。
逻辑树222是元素的树,每个元素表示控制、控制中的条目、或分组结构,可以是对话框、框格(pane)、或框架(frame)。逻辑树222的结构应当按用户的感知来表示应用程序的UI(即使实际上控制是使用不同的下层结构来实现的)。该树随时间流逝应该是稳定的。只要应用程序对用户而言看起来是一样的,即使应用程序幕后的实现细节已经改变,表示该应用程序的逻辑树仍应保持相同。因结构化和实现原因而存在的固有元素,诸如微软OS产品中外壳的“ShDocView”视窗,不应出现在该树中,因为用户不会感知到它们。
逻辑树222是多个片断建立的单独的树,它能够一体化多个不同进程从而使其对客户机而言是相同的。逻辑树222使能块检索,并能够获取属性列表的值。当用户通常已进行交叉进程调用来请求数值时,可存取性系统200将通过使用逻辑树222获取这些数值。
与已知系统中只以一个步骤构建的结果不同,逻辑树222是由用于建立原始树的片断所构建的。如图5所示,有三个主要过程来建立逻辑树222。在过程72,可存取性系统200定位下层下层技术的固有元素,并抵达如图4(A)所示的固有树。在过程74,可存取性系统200组合固有元素以形成如图4(B)所示的原始树。最后,在过程76,通过隐藏原始树20中的不感兴趣组件获得逻辑树222,如图4(D)所示。
图4(A)示出了两个固有树10和14,它们从下层技术的固有元素构建,诸如Win32 UI或任何其它可用UI。固有树10包括父节点11和多个互相之间有多种关系的子孙节点12。类似地,固有树14包括具有多个子节点16的父节点15。子节点16可描述为彼此的兄弟姐妹。
如图4(B)所示,可组合固有树10和14以形成原始树20。原始树20包括父节点21,其有两个子节点22和30。子节点22有子孙节点23-29,而子节点30有子孙节点31-33。该原始树20是固有树10和14的组合,其中固有树10的节点形成节点22-29,而固有树14的节点形成节点30-33。
通过如图4(C)和4(D)明示的方法,原始树20可转换成逻辑树222。从原始树20转变成逻辑树222,开发者可在原始树上插入提示。开发者可把原始树20中的节点标记为“隐藏自己”或“隐藏自己和子节点”或“隐藏节点的子节点”等等。开发者也可把节点移到旁边,或者把节点放置在子节点之前。可使用这些“提示”和原始树20上的改变来形成逻辑树222。例如,在图4(C)中,开发者把原始树20的节点24-26和33标记为不感兴趣的,如框40和41所指示。通常,把包含不能被用户看见的元素的节点标记为不感兴趣。与看见UI相关的节点通常被视为是感兴趣的,并将被包括在逻辑树222上以由AT客户机300使用。如图4(D)所示,在逻辑树222上不包括被标记为不感兴趣的节点。
可存取性系统200使用逻辑树222来找出有关事件、系统状态、对象位置的信息以及有关控制的信息。已知系统尚未有在其树上仔细研究的能力。逻辑树222能基于客户机300的优选进行导航,且无论所使用的是何种服务器侧应用程序都能够提供信息。
操作上,如果客户机300需要为用户获取有关应用程序的信息,客户机300寻找要按下的按钮,并观察按钮上的文字。客户机300将调用API“找出元素”。API将返回一个指向客户机侧接口220的逻辑树222中位置的数值。通过逻辑树222,可存取性系统200都给予客户机300一个UI的抽象视图,而与所使用的应用程序无关。该抽象模型包括列表框、按钮或其它UI组件可期望彼此相同的结构、属性、事件、以及功能性。
逻辑树222是UI逻辑表示的单个一体化树,它形成仅包括对客户机300感兴趣的元素的形式。因此,与迫使AT产品过滤UI元素的结构化层次并猜测展示给终端用户的模型相反,逻辑树222展现了一种贴切映射展示给终端用户的结构层次。这极大地简化了AT产品向用户描述UI的任务,并有助于用户与应用程序间的交互。
由于该逻辑树222是可存取性系统200的下层部分,可存取性系统200的所有其它组件可根据逻辑树222工作来设计。例如,图6显示了一种具有极简单结构的简单对话框60。然而,从当前可用的可存取性技术角度观察时,该对话框60的结构竟然惊人地复杂。它包含264个对象,AT产品必须对其逐个过滤以发现哪些对终端用户具有意义。有了可存取性系统200及其对逻辑UI树222的支持,拥有该对话框60的开发者可设置一些属性,以向AT产品300展示如图6所示的以下结构。
如图6所示,对于“Run”对话框,开发者可把滚动的窗口图62和63的“键入程序、文件夹、文件或因特网资源的名字,并且窗口会为您打开它”表示为感兴趣的。开发者也可把包括notepad(记事本)、word(Word字处理软件)、calculator(计算器)等等的组合框以及OK(是)按钮65、cancel(否)按钮66以及browse(浏览)按钮表示为感兴趣的。这提供给开发者一种低成本机制,以分层次标记其元素并因此通过UI可存取性系统200产生其应用程序UI的逻辑表示。每个所示属性都可以由与逻辑树222上每个其它节点有特定关系的一个节点来表示。给逻辑表示向测试组和AT产品或客户机300提供了即时的好处。
一组API可使客户机300能获得0树。功能包括:(1)点到点的逻辑元素;(2)事件的逻辑元素;(3)当前为焦点的逻辑元素。如上所述,逻辑元素表示UI组件、也可能是控制、控制的一部分、或容器或逻辑组合(例如对话框、框格或框架)。控制根据其功能性变化极大。因此,使用不同的接口来表示与特定控制类型相关联的功能性。这些控制专用接口源自表示对所有控制都相同的功能性的通用基本接口。该通用基本接口包含:(1)用来导航逻辑树222的方法;(2)用来获取属性值的通用方法;以及(3)用来访问被支持控制专用接口的方法。在逻辑树222的导航中,某种下层应用程序UI技术都为导航提供其自己的技术。
尽管逻辑树222对用户而言是最为感兴趣的,原始元素树20也提供了某些重要功能。逻辑树222仅包含用户相关的元素,而原始元素树20则包含表示下层框架实现结构的诸如22的节点。例如,对于WIN32 UI片断,该树将包含表示HWND的节点。在某些方面,原始元素树20是逻辑元素树222和下层框架自己固有元素树之间的“中间机构”。原始元素树20被用作构建逻辑元素树的下层,且其是固有元素首先插入系统的地方。
也可使用原始元素树20作调试和测试。查明或描述特定问题节点的所在是有用的。基本原始元素节点上的功能包括:用来导航原始元素树的方法;用来跳到相应逻辑元素(如果存在)的方法;包含该元素的‘调试字符串’的属性-例如HWND节点的“HWND 0x483FE”;以及其它‘幕后基础设施’方法。这些其它方法使能击中测试和位置;事件;以及展现框架能轻松提供的属性(例如,聚焦的、使能的)。
原始元素树20包含表示来自各种描绘引擎(rendering engine)的元素的节点22-33。原始元素树被用作描绘引擎将自己插入可存取性系统200的起点,并从适合诸如来自Win32的HWND的固有元素的轻量级适配器对象建成一体化逻辑树222。它还被用来处理宿主转变(hosting transition),其中一种技术是另一种技术的宿主。由于原始元素树20是构建逻辑树222的下层,可使用它来检查逻辑树是否完整和相连的,并检查未予说明的元素。对于其它类下层设施任务也可使用原始元素树20:诸如提供某些基本元素ID并提供某些基本框架提供的元素属性,诸如聚焦的、使能的和位置。
原始元素树20不是AT产品或客户机300的信息的主要来源,不被用来逻辑导航,也不被展现给终端用户。原始元素树20也不能用于捕捉元素在树上的位置从而在将来的某个时间点其可被返回。逻辑元素树222执行所有的这些功能。
原始元素树20通常无需所代表逻辑元素的知识,就可从下层描绘技术的原始元素(HWND,Elements)机械地构建。因此可使用其来寻找未在逻辑树222上说明的原始元素。原始元素树20是有用的调试和诊断工具,因为它允许捕捉节点位置的类‘堆栈转储’(stack dump)描述。此外,已知系统把它们的树基于代码特定标准,且难以用不同技术实现。本方法使用一种通用的抽象‘原始元素’类型,它可由(或代表)任何下层描绘技术实现。
为了获取原始元素树,调用原始元素根将获得桌面元素,这通过确保其父节点为空(NULL)且所有其它节点都将其作为最终的祖先得到检验。为了获取其它元素,调用方法以从特定点获取原始元素将使用有效的屏幕坐标返回元素。获得原始元素树之后,可通过检查元素(父节点、姐妹节点和子节点)来检查和检验它。
操作上,客户机300能使用诸如:父节点、后姐妹节点、前姐妹节点、第一子节点、最后子节点等等的关系来导航原始元素树20。客户机300能从原始元素跳到逻辑树222上的相应逻辑元素。
事件机制
当客户机想要保持所获得事件的通知时,客户机300能够通过如图3所示的UI自动客户机202登记以获取该信息。客户机300指定想要接收的对象信息、信息去向、以及想要取回的属性列表。客户机请求发往UI自动客户机202。UI自动客户机202能监视桌面上的任何进程。UI自动服务器204跟踪在收听的那个客户机300,并知道如何返回UI自动客户机202。UI自动客户机202向UI引擎206通知客户机的兴趣,因此UI引擎206知道何时把事件告诉UI自动服务器204。UI引擎不必利用客户机通知,但相反可选择一直向UI自动服务器204通知事件,或者仅当客户机在听取任何事件时通知UI自动服务器。如果仅当有客户机在听取事件时UI引擎想要开启UI自动服务器通知,通知是有用的。UI引擎会这样做,以避免UI速度的可能下降并避免载入它可能并不需要的代码模块。
然后UI引擎206向UI自动服务器204告知UI事件。UI自动服务器204向客户机300返回所请求的逻辑元素,并向客户机300发送包括客户机300所请求事件属性的信息。UI自动服务器204判定哪些信息在客户机请求的范围之内,且仅当信息引起兴趣时才形成逻辑元素。形成逻辑元素包括在UI自动服务器侧预取客户机已指示的它将在处理事件时使用的属性组。例如,UI自动服务器204能为组合框发现逻辑元素。范围是该组合框及其子框。客户机300能够请求子/父/亲属元素在登记阶段定义范围。
在UI自动服务器204确定信息是否在被请求范围内后,它建立逻辑元素。UI自动客户机202通过与目标应用程序的对话向客户机300提供从UI自动服务器204接收被请求信息,并将对象路由到客户机300上适当空间的服务。
在客户机300登记要接收事件通知时,创建UI自动服务器204。作为示例,UI引擎206运行微软Word字处理应用程序。客户机300已登记作名字属性改变。客户机的登记使得UI自动服务器204被创建。客户机的登记还向UI引擎206通知开始把名字属性通知给UI自动服务器。UI引擎206未得到范围信息。UI引擎206为服务器侧调用API之一。UI引擎指定(1)哪个属性已改变;(2)属性的新值;以及(3)可能的旧值。UI自动服务器204基于客户机300感兴趣的事件而创建,并且因此知道感兴趣的事件、属性、客户机、以及范围,从而它知道是否有任何客户机300对已创建的逻辑元素感兴趣。如果一个以上客户机300已向特定UI自动服务器204登记了事件,且客户机300已登记了相同事件并已请求大量地取得属性和已返回逻辑元素,当UI自动服务器204把事件返回给客户机300时,每个客户机300将得到与逻辑元素一起返回的被请求大量属性的联合体。
对于在接收的每个客户机300,UI自动服务器204通过向客户机传递关联于事件的逻辑元素来通知客户机300。UI自动服务器204仅创建一个逻辑元素。这是对需要每个客户机请求它们所有的作为事件来源的对象副本的现有技术的改进。
如果在客户机登记事件时UI引擎206未利用UI自动客户机的通知,UI引擎206能向UI自动服务器204询问是否有任何可存取性客户机300在接收,并且如果没有客户机在接收,则可避免创建信息并将其发送给UI自动服务器204的工作。例如,屏幕读取器是客户机300,且指定它想要的信息去向、接收事件的焦点改变对象、以及感兴趣的特定属性列表。则可通知UI引擎206,并且它知道应当向UI自动服务器204发送事件。检测到焦点改变后,UI引擎206通知UI自动服务器204。UI自动服务器204转换成众所周知的接口,并把事件和对象发送给UI自动客户机202。UI自动客户机202把对象路由到客户机300上的适当空间。
通过去除内核中事件的中央存储库,基于已知系统的上述组件就可得到改进。相反,UI自动服务器204知道所有的客户机300对获取有关在其中运行的环境的信息感兴趣。对内核存储库的去除还创建了更多点对点的交互,因为UI自动服务器204完成了先前在内核中执行的功能。本发明的可存取性系统200给予客户机300指定想要查看内容的能力,从而可使用UI自动服务器204在服务器侧完成过滤。
图7是示出涉及事件登记和通知方法的过程的流程图。在步骤80,客户机300请求事件通知。在步骤82,UI自动客户机202把请求传送给UI自动服务器204。在步骤84,UI自动客户机通知它想要得到通知的UI引擎206。在步骤86,UI自动服务器204从UI引擎206接收通知。在步骤88,UI自动服务器204过滤已接收的信息。如果在步骤90发现已接收信息与用户无关,UI自动服务器204在步骤92去除信息并继续等待通知。或者,在步骤90发现信息有关,UI自动服务器204在步骤94创建逻辑元素并将其发送给UI自动客户机202。在步骤96,UI自动客户机202将已接收信息放置在客户机300上的适当位置。
可存取性系统200的事件机制210使客户机300能登记接收UI的属性改变、控制结构中的树改变、多媒体事件、以及相关信息的事件通知。没有这些能力,客户机300不得不持续地遴选系统中所有的UI元素以发现是否有任何信息、结构或状态改变。可存取性系统200的事件机制210还使客户机300能接收进程外事件、请求要与事件通知一起返回的属性集,并为多个元素上的事件进行登记。
事件机制210展现:AT产品或测试应用程序用于登记事件的接口;AT产品在对象上实现的用于接收事件通知的接口;以及控制实现其用于通知UI事件的事件引擎的接口。事件机制210被用来使AT产品和测试应用程序能接收独立于UI引擎用以描绘UI的事件,并使AT产品和测试应用程序无论何种下层技术都能追踪上层应用程序窗口。
图2示出了客户机300如何与可存取性系统200交互。没有跨越进程的全面管理。相反,每个可存取性系统客户机300或服务器400都有自己的环境。客户机应用程序仅接收支持可存取性系统200的应用程序的事件。为了开始在应用程序中使用可存取性系统事件,客户机300能做以下四件事情之一:(1)使用“AddTopLevelWindow Listener”API来发现出现在桌面上以及正在处理该事件的新UI、登记其它事件并通过该装置接收来自任何进程的事件;(2)使用“Find”API之一定位感兴趣的UI,并锁定一特定UI;(3)使用某些其它装置发现感兴趣的UI,诸如在屏幕上找到窗口处理器或点,并使用该处理器或点来获取用作接收事件指引的逻辑元素;或者(4)使用“AddFocus ChangedListener”API来追踪输入焦点并登记UI上当前为焦点的事件。
上层窗口是其父为桌面的窗口。术语“打开”的使用指示向用户显示新的上层窗口。术语“关闭”的使用指示上层窗口已消失。
可存取性系统服务器侧接口230包括用来向可存取性系统200通知正在添加和去除的事件的两个API。在客户机登记事件和对其撤销登记时,UI自动客户机调用这些API。这使UI引擎206获得有关在其背景中正在请求哪些可存取性事件的信息。
当可应用时,事件与来自应用程序逻辑元素树222的逻辑元素相关联。当逻辑元素不可应用时,事件与人类可读字符串或其它代表事件来源的众所周知的对象相关联。事件机制210基于在事件登记期间提供的用户喜好来提供过滤。通过使用服务器上客户机的过滤喜好,在创建事件相关数据并跨进程地将其发送给客户机之前,事件机制210通过减少跨进程调用的数量固有地改进进程外性能。事件机制210提供在事件登记期间指定对事件感兴趣的逻辑元素的属性的方法。这进一步减少了跨进程调用的数量。无需改变主操作系统(OS)就可扩展事件机制210。尽管可使用经管理的代码来实现事件机制210,未经管理的应用程序通过COM互操作性仍能够访问它。
AT客户机300处理事件而执行的两个任务是:(1)事件登记;和(2)在回收中处理事件。对任一任务的要求是在经管理和未经管理代码中都是可用的。在本发明的一实施例中,客户机300在登记事件时可传递接口。客户机300在登记时传递实现众所周知接口的对象,且UI引擎206回收这些接口以通知接收者。在逻辑元素树222中有源对象的情形中,每次回收都接收源元素和一附加参数。
由AT产品可实现的众所周知的接口可用作是返回事件的方法。以下章节显示某些类型的事件,登记看上去的样子以及如何接收事件。
1.上层窗口事件
上层窗口事件包括有关菜单和下拉组合框的事件或任何以桌面为父的特征。在本发明的一实施例中,使用AddTopLevelWindowListener方法来接收上层窗口被打开和关闭的通知。调用AddTopLevelWindowListener将获得在当前桌面上有新上层窗口打开或上层窗口关闭的通知。RemoveTopLevelWindowListener方法提供终止接收桌面上上层窗口被打开或关闭的通知。该方法使用回收对象来标识该接收者。因此,传递到RemoveTopLevelWindowListener方法中的对象与传递给AddTopLevelWindowListener的对象相同。对于每个打开的新上层窗口,由可存取性系统200调用OnTopLevelWindowOpened方法一次。类似地,当上层窗口关闭时,由可存取性系统200调用OnTopLevelWindowClosed方法一次。为了接收这些通知,客户机300调用AddTopLevelWindowListener方法。
2.焦点事件
客户机300常常需要用来跟踪焦点的方法。在微软窗口OS中这样做是困难的。例如,当菜单下拉时(例如微软Word中的File菜单),随着用户将光标逐个下移,菜单中的条目成为焦点。当菜单关闭时(例如用户按下ESC键)没有焦点事件发出。相反,对焦点改变感兴趣的客户机必须接收众多事件,并指出其中哪些逻辑上表示了焦点的改变。在本发明的一实施例中,可使用AddFocusChangedListener方法来向接收者通知焦点改变事件。客户机300可指定要返回的属性组。指定与逻辑元素一起返回的属性的该特征是所有事件登记API的一部分。客户机300可调用RemoveFocusChangedListener方法来终止接收焦点改变的通知。该方法可使用回收对象来标识接收者,且在此情形中传递到RemoveFocusChangedListener方法中的对象与传递给AddFocusChangedListener的对象相同。可存取性系统200在焦点已改变时调用OnFocusChanged方法。在OnFocusChanged方法中使用的FocusEventArgs参数展现有关焦点改变的信息。如果可得到有关最后焦点的逻辑元素的信息,则该元素将在OnFocusChanged元素中使用的事件args参数中可用。也有情形是直到明确地在一元素上加了焦点才有UI元素焦点。
3.属性改变事件
当逻辑元素的属性改变时,可引发属性改变事件。在本发明的一实施例中,客户机300调用AddPropertyChangedListener方法,以接收属性改变的通知。当逻辑元素树上在AddPropertyChangedListener中指定的逻辑元素的属性值改变时,由可存取性系统200调用OnPropertyChanged方法。范围参数指示事件应引发的是哪些元素。例如,传递窗口的根逻辑元素和对子孙元素的请求限制对该窗口的属性改变回收。如果对树上的所有元素设定范围参数,则略去范围,且发送发生在桌面上的对指定属性的任何改变。客户机300可用不同属性组和/或不同回收对象对AddPropertyChangeListener进行多次调用。由可存取性系统200提供的通知指示:已改变的属性;新属性值;以及旧属性值(如可获取)。
客户机300可调用RemovePropertyChangeListener方法以终止接收对属性改变的通知。该方法可使用范围元素以及回收对象以标识该接收者,且在此情形中被传递的对象必须与传递给AddPropertyChangeListener的对象相同。
4.来自控制模式的事件
由控制模式引发的事件必需是可扩展的,且因此由GUID标识这些事件。当登记时可接受任何GUID值。对于任何新的控制模式,它所记录的事件必需是唯一的GUID。可能需要更改AT产品以接收新的控制模式事件。接收者还必需能够确定这些事件的范围。例如,有向测试可能想要把这些事件限制在特定应用程序或应用程序中的控制。控制模式定义什么是来源,且事件消费者将需要指出那部分文件以便知道如何使用来源元素和事件变量对象。
AddEventListener方法将使客户机300能接收用于控制的事件。能使用范围参数以指示引发事件的是哪些元素。例如,传递窗口的根逻辑元素并请求子孙元素将把事件限制在该窗口。如果想要树上所有的元素,则发送桌面上所有的事件。可使用RemoveEventListener方法以终止接收对属性改变的通知。该方法可使用范围元素回收对象、以及事件标识符以标识该接收者,且在此情形中被传递的对象必须与传递给AddEventListener的对象相同。
当应用程序已调用了AddEventListener方法时,由可存取性系统200在控制特定事件被引发时调用OnEvent方法,且事件的来源是逻辑元素树上AddEventListener中指定的逻辑元素。当引发控制的事件时,常常可得到事件特定信息。
可调用RemoveAllListener方法以终止任何事件。这是在客户机应用程序关闭前进行整理的快速方法。在结束应用程序时可选地使用去除方法。
5.逻辑结构改变事件
当逻辑元素树结构改变时,引发了逻辑结构改变事件。可实现AddLogicalStructureChangedListener方法以接收逻辑元素树上结构变化的通知。当添加、去除逻辑元素或使其失效时,调用指定回收对象上的方法。范围参数可如上所述地限制元素。可使用RemoveLogicalStructureChangedListener方法以终止接收对逻辑元素树改变的事件。该方法可使用回收对象和范围元素以标识该接收者,且在此情形中被传递的对象必须与传递给AddEventListener的对象相同。
当添加子元素,且父元素是在AddLogicalStructureChangedListener中指定的逻辑元素树222上的逻辑元素时,可由可存取性系统200调用OnChildAdded方法。当去除子元素,且其旧的父元素是在AddLogicalStructureChangedListener中指定的逻辑元素树上的逻辑元素时,可由可存取性系统200调用OnChildRemoved方法。
当在短暂时间阶段内添加大量子元素时(例如超过20个子元素),由可存取性系统调用OnChildrenBulkAdded方法。当在短暂时间阶段内去除大量子元素时,由可存取性系统调用OnChildrenBulkRemoved方法。当在短暂时间阶段内同时添加并去除大量子元素时(例如超过20个子元素),由可存取性系统调用OnChildrenInvalidated方法。
6.多媒体事件
另一类事件是多媒体事件。多媒体可包括声音、视频以及动画。方法可支持多媒体事件并向客户机通知动作,包括“终止”、“暂停”、“快进”、“倒带”以及“静音”。可实现类似于如上所述的用来添加和去除多媒体接收者的方法。
7.简单声音事件
简单声音事件可与多媒体事件分开处理。简单声音事件代表用于向用户传送有别于声音本身的某些事件的简单、短暂的声音。简单声音事件可包括:新邮件抵达时播放的声音;当笔记本电池能量较低时产生的声音;或者邮箱以IconExclamation类型显示时播放的声音。可调用AddSoundListener方法以接收正在播放的简单声音的通知,且也可实现RemoveSoundListener方法以终止接收简单声音事件的通知。
当已播放简单声音时由可存取性系统200调用OnSound方法。为了接收该通知,正在接收的应用程序调用AddSoundListener。OnSound方法取得以下信息:声音的名字;声音的来源;以及指示声音对用户的重要性的警报级别值。可能的警报级别包括:‘未知’,指示重要性未知;‘报告’,指示信息已被展现;‘警告’,指示警告情形;‘询问’,指示需要用户响应;‘惊叹’,指示该事件不是关键但可能是重要的;以及‘关键’,指示关键事件的发生。
8.软焦点事件
软焦点事件出现在桌面上但保留在背景中。软焦点事件的某些示例是:在通知区域指示“可获得新更新”的气球状帮助窗口;任务条上想要获得焦点的背景应用程序的闪动图标;以及当打印开始和结束时在通知框出现或消失的打印机图标。这些事件看起来与其它事件种类有些交叠(多媒体可象软焦点一样涉及动画事件)。然而,基于事件要传送给用户的内容而不是传送事件的方法来对事件进行分类。
可实现AddSoftFocusListener方法以接收未成为输入焦点而尝试得到用户注意的事件的通知。RemoveSoftFocusListener方法终止通知。该方法可使用回收对象来标识该接收者,且因此所传递的对象应当与传递给AddSoftFocusListener的相同。
当发生软焦点事件时,由可存取性系统200可调用OnSoftFocus方法。为了接收该通知,在接收的应用程序或客户机300调用AddSoftFocusListener。可使用源元素(如可得到)来得到有关事件的更多信息。示例源元素会是由系统框中通知应用程序之一使用的气球状帮助窗口的逻辑根元素。OnSoftFocus方法返回:事件名;事件来源;以及指示对用户的重要性的警告等级。
当客户机300使用AddTopLevelWindowListenerAPI接收来自特定过程的事件时,以下图表说明客户机300和可存取性系统200的动作。
客户机 |
可存取性系统和目标UI窗口 |
调用AddTopLevelWindowListener |
·可存取性系统客户机开始一线程以观察在创建和消除的上层应用程序窗口·新的UI出现,且可存取性系统客户机调用该客户机的OnTopLevelWindow Opened方法 |
从OnTopLevelWindowOpened方法调用其它API以登记发生在目标UI窗口的其它事件 |
·可存取性系统客户机向目标UI窗口传送事件Id以便能选择性地通知事件。·可存取性系统客户机把事件Id和过滤信息传送给可存取性系统服务器,因此它可进一步过滤事件。·目标UI窗口使用可存取性系统服务器API来向可存取性系统服务器侧通知感兴趣的事件。 |
处理回收对象中的事件 |
·可存取性系统服务器把事件传回可存取性系统客户机。 |
|
·可存取性系统客户机回收客户机应用程序提供登记的对象 |
客户机 |
可存取性系统和目标UI窗口 |
调用RemoveListener以终止接收事件 |
·可存取性系统客户机向可存取性系统服务器和目标UI窗口传送不再感兴趣的事件。·目标app终止向可存取性系统服务器传送事件 |
事件通知
由服务器400或下层UI引擎使用相应的事件通知方法以支持以上列举的可存取性系统事件。UI自动服务器API包括该服务器或下层UI引擎可能调用以完成之的方法。例如,有一个服务器调用的NotifyPropertyChanged方法以当逻辑元素上的特定属性改变时进行通知。当UI改变时产生适当的参数并调用这些通知方法取决于服务器400或下层UI引擎。
服务器方法
由UI自动客户机调用AdviseEventAdded方法和AdviseEventRemoved方法以便于在客户机300请求事件时通知服务器400。这使服务器400能在没有一个事件引起兴趣时不向可存取性系统200传播事件。
控制模式
可存取性系统提供了特定UI元素或控制所支持的用以分类以及展现功能的唯一方法。与本领域中把功能关联于特定控制类型(例如按钮、编辑框、或者列表框)相反,可存取性模型定义了通用控制模式集,其中每一个模式定义UI行为的一方面。由于这些模式彼此独立,可将它们加以组合以描述特定UI元素所支持的功能全集。
例如,与根据元素的类名,诸如按钮,来描述元素相反,可存取性系统200把它描述为支持可调用控制模式。控制模式定义由元素支持的结构、属性、事件以及方法。因此,这些模式不仅使客户机能查询控制的行为,还使其能通过使用为特定模式设计的接口来可编程地操纵控制。例如,SelectionContainer模式提供诸方法用以查询选定条目、选择特定条目或取消对其的选择、或者确定该控制是否支持单个或单个选择模式。
目前由可存取性系统300定义的控制模式包括:(1)选择容器;(2)层次;(3)可调用;(4)简单网格;(5)文本;(6)值;(7)请求对象;(8)可滚动;(9)可排序;(10)拖曳;以及(11)其它容器。
该技术使控制开发者能实现新的控制类型而同时仍然具有向AT产品以及测试脚本展现其行为的经明确定义方法。如果引入了新的行为类型,可定义新的控制模式以表达所需功能。
现在可编写附注技术产品和测试脚本以了解如何用每种模式而不是每种UI控制工作。因为控制模式比控制类少得多,该技术使得必需的代码最少。该方法还鼓励一种能有效地询问和操纵新控制的更灵活架构(只要它们支持已知控制模式)。
以下表格提供通用控制以及它们将支持的模式的某些示例。
控制 |
相关控制模式 |
按钮 |
可调用 |
复选框,单选按钮 |
值 |
列表框 |
选择容器、可滚动 |
组合框 |
选择容器、可滚动、值 |
树状视图 |
选择容器、可滚动、层次 |
列表示图 |
选择容器、可滚动、可排序 |
文本框、编辑 |
值、文本、可滚动 |
可使用更多特定接口以展现关联于通用控制模式的功能。这些模式的示例包括:(1)选定管理容器;(2)网格布局容器;(3)包含值的UI值;(4)代表对象的图标(文件、格式等等);以及(5)可调用的UI元素。一般而言,这些模式并未严格绑定于特定控制,且不同的控制可实现相同的模式。例如,列表框、组合框、以及树状示图都实现‘选择管理容器’模式。如果适当时某些控制可实现多个模式:选择网格将实现‘网格布局容器’模式和‘选择管理容器’模式。
没有象先前应用程序中的单独的‘role’(任务)属性。相反,使用了两种不同的机制。控制模式确定控制的可用功能,且人类可读的可本地化属性提供用户能了解的控制类名,诸如‘按钮’、‘列表框’等等。
属性
可存取性系统200将给通用GetProperty方法加以特征。属性更适宜由GUID表示,其带有用来转换成或转换自不可本地化的记忆形式(对脚本和配置文件有用)并可获取本地化描述的实用方法。通用GetProperty方法与单个方法相比的两个关键优点是(a)它允许不改变接口就可随着时间的流逝来添加新属性;以及(b)它允许获取在使用单个方法时不可能实现的技术-诸如阵列驱动的块属性取得。每个属性必须具有清晰定义的意图。必须清晰定义属性是否旨在用作人类或机器消费、或者属性是否可本地化、等等。
本发明已针对特定实施例进行了描述,这些实施例在所有方面中都是说明性的而非限制性。对本领域技术人员来说,本发明包含的不背离其范围的可选实施例将是显而易见的。
从前述可见,本发明能很好地适应以达到以上所述的所有结果和对象,以及对于该系统和方法而言明显并固有的其它优点。可以理解某些特征和子组合是实用的,并可不参照其它特征和子组合采用。这是可预期的,并在权利要求书范围之内。