一种软件界面文本信息的辅助浏览方法转让专利

申请号 : CN201010593499.3

文献号 : CN102023805B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陆一峰陈天洲何跃明徐青松王卫岳张楠

申请人 : 浙江大学杭州华驰科技有限公司

摘要 :

一种软件界面文本信息的辅助浏览方法,该方法包括如下步骤:A:生成目标窗口的文本坐标映射表;所述文本坐标映射表中包含所述目标窗口上显示的文本及相应的位置坐标;B:用户使用输入设备移动屏幕指针后,在所述文本坐标映射表中查找与屏幕指针的当前位置最接近的界面元素的文本;C:播放查找到的文本的内容。本发明的方法通过获取软件界面上显示的文本及相应的位置坐标来生成文本坐标映射表,并使用文本坐标映射表查找与当前屏幕指针位置最接近的界面元素的文本,进而实现辅助用户浏览软件界面文本信息的功能。该方法可以让用户快捷地在软件界面上的各文本信息间进行跳转、浏览。

权利要求 :

1.一种软件界面文本信息的辅助浏览方法,其特征在于,该方法包括如下步骤:A:获得用户当前正在使用的目标程序的系统运行信息,所述系统运行信息包括进程ID,通过进程ID在目标进程中创建远程线程,并且在该远程线程中加载并初始化用于拦截文本输出函数的动态链接库DLL,在目标进程的动态链接库DLL导入表项中找到一个项,将该项中包含的系统提供的文本输出函数的入口地址修改为相应的自定义文本输出函数的入口地址,当系统对目标程序的目标窗口进行绘制时,能够获得目标窗口上输出的文字内容与对应坐标,最终生成目标窗口的文本坐标映射表;所述文本坐标映射表中包含所述目标窗口上显示的文本及相应的位置坐标;

B:用户使用输入设备移动屏幕指针后,在所述文本坐标映射表中查找与屏幕指针的当前位置最接近的界面元素的文本;

C:播放查找到的文本的内容。

2.如权利要求1所述的方法,其特征在于,

在所述步骤B之后,还包含如下步骤:

如果在所述文本坐标映射表中查找到与屏幕指针的当前位置最接近的界面元素的文本,则根据所述文本坐标映射表中记录的该文本所对应的位置坐标,将屏幕指针定位到相应的位置。

3.如权利要求1或2所述的方法,其特征在于,

在所述步骤B中,采用如下方式在所述文本坐标映射表中查找与屏幕指针的当前位置最接近的界面元素的文本:根据屏幕指针的移动方向,在所述文本坐标映射表中查找该移动方向上与屏幕指针的当前位置最接近的界面元素的文本。

4.如权利要求3所述的方法,其特征在于,

在所述步骤B中,采用如下方式实现根据屏幕指针的移动方向,在所述文本坐标映射表中查找该移动方向上与屏幕指针的当前位置最接近的界面元素的文本:当屏幕指针的移动方向为向上时,如果屏幕指针当前位置所属的列的上方有文本,则获取位于该列的与屏幕指针当前位置最接近的文本;否则将屏幕指针向左或向右移动一列或多列并在对应列向上查找,直到查找到文本或屏幕指针达到所述目标窗口的左边界或右边界;

当屏幕指针的移动方向为向下时,如果屏幕指针当前位置所属的列的下方有文本,则获取位于该列的与屏幕指针当前位置最接近的文本;否则将屏幕指针向右或向左移动一列或多列并在对应列向下查找,直到查找到文本或屏幕指针达到所述目标窗口的右边界或左边界;

当屏幕指针的移动方向为向左时,如果屏幕指针当前位置所属的行的左方有文本,则获取位于该行的与屏幕指针当前位置最接近的文本;否则将屏幕指针向上或向下移动一行或多行并在对应行向左查找,直到查找到文本或屏幕指针达到所述目标窗口的上边界或下边界;

当屏幕指针的移动方向为向右时,如果屏幕指针当前位置所属的行的右方有文本,则获取位于该行的与屏幕指针当前位置最接近的文本;否则将屏幕指针向下或向上移动一行或多行并在对应行向右查找,直到查找到文本或屏幕指针达到目标窗口的下边界或上边界。

5.如权利要求1所述的方法,其特征在于,

在所述步骤B中,用户使用输入设备移动屏幕指针之后、在所述文本坐标映射表中查找与屏幕指针的当前位置最接近的界面元素的文本之前,还包括如下步骤:B1:判断屏幕指针的当前位置是否在所述目标窗口内部,如果不在,则将屏幕指针的当前位置定位到所述目标窗口的内部。

6.如权利要求5所述的方法,其特征在于,

在所述步骤B1中,所述目标窗口的内部为所述目标窗口的边界。

7.如权利要求6所述的方法,其特征在于,

在所述步骤B1中,所述目标窗口的边界为所述目标窗口的左上角。

8.如权利要求6所述的方法,其特征在于,

在所述步骤B1中,如果判定屏幕指针的当前位置不在所述目标窗口内部,则采用如下方式之一定位屏幕指针的当前位置:当用户向右移动屏幕指针时,将屏幕指针的初始位置定位到所述目标窗口的左边界;

当用户向左移动屏幕指针时,将屏幕指针的初始位置定位到所述目标窗口的右边界;

当用户向下移动屏幕指针时,将屏幕指针的初始位置定位到所述目标窗口的上边界;

当用户向上移动屏幕指针时,将屏幕指针的初始位置定位到所述目标窗口的下边界。

9.如权利要求1所述的方法,其特征在于,

在所述步骤A之后,还包括如下步骤:

当接收到前景窗口变换的消息时,清空所述文本坐标映射表中的内容,将当前活动窗口作为新的目标窗口,生成该新的目标窗口的文本坐标映射表。

10.如权利要求1所述的方法,其特征在于,

在所述步骤A之后,还包括如下步骤:

当接收到所述目标窗口的拖放开始消息时,清空所述文本坐标映射表中的内容;

当接收到所述目标窗口的拖放完成消息时,重新生成所述目标窗口的文本坐标映射表。

11.如权利要求1所述的方法,其特征在于,

在所述步骤A之后,还包括如下步骤:

以预先设定的时间间隔重复执行如下操作:清空所述文本坐标映射表中的内容,重新生成所述目标窗口的文本坐标映射表、或将当前活动窗口作为新的目标窗口,生成该新的目标窗口的文本坐标映射表。

说明书 :

一种软件界面文本信息的辅助浏览方法

技术领域

[0001] 本发明涉及计算机软件技术领域,尤其涉及一种软件界面文本信息的辅助浏览方法。

背景技术

[0002] 随着计算机软硬件技术的飞速进步,当今社会已经进入了一个信息化的时代,计算机、因特网、移动通讯已经成为人们日常生活、学习和工作的重要组成部分。在信息社会中,通过计算机获取信息和交流信息已经成为人们工作和生活的基本手段之一,因而信息平等已经成为信息社会中人人平等的基础。所谓信息平等就是任何人在任何情况下都能平等、方便、无障碍地获取信息、交流信息和利用信息。
[0003] 信息无障碍化是一项民生工程,是国家和社会体现人文关怀精神的必然要求,是建设全面信息化社会的基本内容,是实现行业全面、协调且可持续发展的必要途径,也是缩小数字鸿沟、建立公平信息社会的一项重要工作。
[0004] 目前,研究人员已开发出多种用于消除盲人使用计算机时存在的各种障碍的技术,MSAA(Microsoft Active Accessibility,微软主动式辅助)技术就是其中之一。对于符合MSAA技术标准的应用程序,当盲人用户通过输入设备(键盘、鼠标等)将屏幕指针定位到应用程序界面的某一位置时,应用程序或者读屏软件可以朗读出该位置所包含的文本。例如,屏幕指针的当前位置为按键时,应用程序可以读出该按键上显示的文字。
[0005] 同时,为了满足用户对软件产品的易用性、扩展性和个性化的需求,软件界面的开发越来越强调高效、易于扩展和艺术化,人们常见的标准化界面所占的比重在不断降低。例如,中国的软件开发商腾讯、迅雷等开发的软件客户端产品多采用上述方式来设计软件界面,从而很好地将软件界面与功能逻辑进行分离,同时易于实现各种界面效果,如换肤,透明等。但是,这种软件界面开发技术并不支持MSAA技术标准,导致现有的读屏软件无法获取这些软件中包含的文本信息,盲人用户无法操作这些软件,给盲人使用计算机带来很大的不便。

发明内容

[0006] 本发明所要解决的技术问题是,克服现有技术的不足,提供一种在不需要MSAA等技术标准支持的情况下,实现软件界面文本信息辅助浏览的方法。
[0007] 为了解决上述问题,本发明提供一种软件界面文本信息的辅助浏览方法,该方法包括如下步骤:
[0008] A:生成目标窗口的文本坐标映射表;所述文本坐标映射表中包含所述目标窗口上显示的文本及相应的位置坐标;
[0009] B:用户使用输入设备移动屏幕指针后,在所述文本坐标映射表中查找与屏幕指针的当前位置最接近的界面元素的文本;
[0010] C:播放查找到的文本的内容。
[0011] 此外,在所述步骤B之后,还包含如下步骤:
[0012] 如果在所述文本坐标映射表中查找到与屏幕指针的当前位置最接近的界面元素的文本,则根据所述文本坐标映射表中记录的该文本所对应的位置坐标,将屏幕指针定位到相应的位置。
[0013] 此外,在所述步骤B中,采用如下方式在所述文本坐标映射表中查找与屏幕指针的当前位置最接近的界面元素的文本:
[0014] 根据屏幕指针的移动方向,在所述文本坐标映射表中查找该移动方向上与屏幕指针的当前位置最接近的界面元素的文本。
[0015] 此外,在所述步骤B中,采用如下方式实现根据屏幕指针的移动方向,在所述文本坐标映射表中查找该移动方向上与屏幕指针的当前位置最接近的界面元素的文本:
[0016] 当屏幕指针的移动方向为向上时,如果屏幕指针当前位置所属的列的上方有文本,则获取位于该列的与屏幕指针当前位置最接近的文本;否则将屏幕指针向左或向右移动一列或多列并在对应列向上查找,直到查找到文本或屏幕指针达到所述目标窗口的左边界或右边界;
[0017] 当屏幕指针的移动方向为向下时,如果屏幕指针当前位置所属的列的下方有文本,则获取位于该列的与屏幕指针当前位置最接近的文本;否则将屏幕指针向右或向左移动一列或多列并在对应列向下查找,直到查找到文本或屏幕指针达到所述目标窗口的右边界或左边界;
[0018] 当屏幕指针的移动方向为向左时,如果屏幕指针当前位置所属的行的左方有文本,则获取位于该行的与屏幕指针当前位置最接近的文本;否则将屏幕指针向上或向下移动一行或多行并在对应行向左查找,直到查找到文本或屏幕指针达到所述目标窗口的上边界或下边界;
[0019] 当屏幕指针的移动方向为向右时,如果屏幕指针当前位置所属的行的右方有文本,则获取位于该行的与屏幕指针当前位置最接近的文本;否则将屏幕指针向下或向上移动一行或多行并在对应行向右查找,直到查找到文本或屏幕指针达到目标窗口的下边界或上边界。
[0020] 此外,在所述步骤B中,用户使用输入设备移动屏幕指针之后、在所述文本坐标映射表中查找与屏幕指针的当前位置最接近的界面元素的文本之前,还包括如下步骤:
[0021] B1:判断屏幕指针的当前位置是否在所述目标窗口内部,如果不在,则将屏幕指针的当前位置定位到所述目标窗口的内部。
[0022] 此外,在所述步骤B1中,所述目标窗口的内部为所述目标窗口的边界。
[0023] 此外,在所述步骤B1中,所述目标窗口的边界为所述目标窗口的左上角。
[0024] 此外,在所述步骤B1中,如果判定屏幕指针的当前位置不在所述目标窗口内部,则采用如下方式之一定位屏幕指针的当前位置:
[0025] 当用户向右移动屏幕指针时,将屏幕指针的初始位置定位到所述目标窗口的左边界;
[0026] 当用户向左移动屏幕指针时,将屏幕指针的初始位置定位到所述目标窗口的右边界;
[0027] 当用户向下移动屏幕指针时,将屏幕指针的初始位置定位到所述目标窗口的上边界;
[0028] 当用户向上移动屏幕指针时,将屏幕指针的初始位置定位到所述目标窗口的下边界。
[0029] 此外,在所述步骤A之后,还包括如下步骤:
[0030] 当接收到前景变换消息时,清空所述文本坐标映射表中的内容,将当前活动窗口作为新的目标窗口,生成该新的目标窗口的文本坐标映射表。
[0031] 此外,在所述步骤A之后,还包括如下步骤:
[0032] 当接收到所述目标窗口的拖放开始消息时,清空所述文本坐标映射表中的内容;
[0033] 当接收到所述目标窗口的拖放完成消息时,重新生成所述目标窗口的文本坐标映射表。
[0034] 此外,在所述步骤A之后,还包括如下步骤:
[0035] 以预先设定的时间间隔重复执行如下操作:清空所述文本坐标映射表中的内容,重新生成所述目标窗口的文本坐标映射表、或将当前活动窗口作为新的目标窗口,生成该新的目标窗口的文本坐标映射表。
[0036] 综上所述,本发明提供了一种不依赖MSAA技术实现的辅助用户浏览软件界面文本信息的方法,该方法通过获取软件界面上显示的文本及相应的位置坐标来生成文本坐标映射表,并使用文本坐标映射表查找与当前屏幕指针位置最接近的界面元素的文本,进而实现辅助用户浏览软件界面文本信息的功能。该方法可以让用户快捷地在软件界面上的各文本信息间进行跳转、浏览。此外,本发明的方法使用了很少的快捷键,操作起来更加方便和人性化,大大降低了盲人用户操作软件的门槛。本发明的方法具有很好的通用性,可以支持各种基于Windows(视窗操作系统)环境的软件。

附图说明

[0037] 图1是本发明实施例软件界面文本信息的辅助浏览方法的流程图。

具体实施方式

[0038] 本发明的核心是,生成包含软件界面上显示的文本及相应的位置坐标的文本坐标映射表,当用户使用输入设备移动屏幕指针时,在文本坐标映射表中查找与当前屏幕指针位置最接近的界面元素的文本,并播放查找到的文本的内容。
[0039] 下面将结合附图和实施例对本发明进行详细描述。
[0040] 图1是本发明实施例软件界面文本信息的辅助浏览方法的流程图。如图1所示,该方法包含如下步骤:
[0041] 步骤101:获得用户(通常为盲人用户)当前正在使用的软件(可称为目标软件或目标程序)的系统运行信息;
[0042] 上述系统运行信息包括:进程ID(Identification,标识符),窗口句柄。
[0043] 上述进程ID可用于在后续步骤中进行远程线程注入DLL(Dynamic LinkLibrary,动态链接库)的操作;上述窗口句柄可用于获取目标程序窗口的位置信息。
[0044] 步骤102:执行远程线程注入DLL的操作;
[0045] 具体地说,本步骤中可以通过目标程序的进程ID,在对应的进程(可称为目标进程)中创建远程线程,并且在该远程线程中加载并初始化用于拦截文本输出函数的动态链接库(可以称为文本函数拦截链接库)。
[0046] 步骤103:在文本函数拦截链接库中执行以下操作:在目标进程的DLL导入表项中找到名称为GDI32.DLL的项,将其中包含的由系统提供的文本输出函数(可称为系统文本输出函数)的入口地址修改为相应的自定义文本输出函数的入口地址;并记录修改前的系统文本输出函数的入口地址;
[0047] 上述系统文本输出函数包括:TextOutA,TextOutW,ExtTextOutA,ExtTextOutW和ScriptShape等;相应的自定义文本输出函数可以记作:MyTextOutA,MyTextOutW,MyExtTextOutA,MyExtTextOutW和MyScriptShape等。
[0048] 步骤104:主动刷新目标程序的目标窗口(通常为当前桌面的活动窗口,或称为前景窗口),或等待目标窗口被刷新(可以称为被动刷新,例如,目标窗口由非活动窗口被切换为活动窗口,目标窗口将被刷新),以引发系统对文本输出函数的调用。
[0049] 上述主动刷新和被动刷新的刷新范围可以是整个目标窗口,也可以是目标窗口的一部分。
[0050] 步骤105:当系统调用系统文本输出函数以便对窗口中的包含文本的界面元素进行绘制时,由于在步骤103中已将系统文本输出函数的入口地址修改为自定义文本输出函数的入口地址,因此引发了系统对自定义文本输出函数的调用,自定义文本输出函数根据系统传递的函数调用参数,生成目标窗口的文本坐标映射表;
[0051] 上述包含文本的界面元素可以是:标题栏、菜单、工具栏、地址栏、客户区等。
[0052] 上述函数调用参数中包含:文本及相应的相对位置坐标。上述相对位置坐标是文本相对于目标窗口的位置坐标(通常为相对于目标窗口左上角的位置坐标)。
[0053] 上述文本坐标映射表中包含了目标窗口中文本,以及该文本所对应的位置坐标。在本实施例中,上述位置坐标为相对位置坐标。
[0054] 在本发明的其它实施例中,上述位置坐标可以是绝对位置坐标(即文本相对于桌面的位置坐标)。文本的绝对位置坐标可以根据文本的相对位置坐标和目标窗口的位置信息换算得出。
[0055] 本实施例中,在自定义文本输出函数中,将文本以及对应的位置坐标写入文本坐标映射表后,可以调用对应的系统文本输出函数完成后续的文本输出操作(即在目标窗口的特定位置绘制相应的文本)。当然,也可以不调用对应的系统文本输出函数,由自定义文本输出函数完成后续的文本输出操作。
[0056] 需要注意的是,本步骤中系统可能会多次调用一个或多个系统文本输出函数,从而会多次调用一个或多个自定义文本输出函数,每次调用都会在文本坐标映射表中写入一条记录,最终生成完整的目标窗口文本坐标映射表。
[0057] 步骤106:当用户使用输入设备(例如,键盘)进行移动屏幕指针的操作后(例如,按下某一方向键时),获取屏幕指针(例如,鼠标指针、光标等)的当前位置,并判断当前的屏幕指针是否在目标窗口的内部,如果不在,则执行步骤107;否则跳转至步骤108;
[0058] 本实施例中,可以通过目标窗口的窗口句柄获得目标窗口的位置信息,并根据屏幕指针的当前位置和目标窗口的位置信息来判断屏幕指针是否在目标窗口的内部。
[0059] 上述窗口的位置信息通常为窗口矩形左上角的坐标,以及窗口的长宽值;当然,根据系统的不同,也可以用其它方式来表示窗口的位置信息,例如,用矩形左上角和右下角的坐标来表示矩形窗口的位置信息。
[0060] 步骤107:将屏幕指针的初始位置(当前位置)定位到目标窗口的内部(包括窗口的边界);
[0061] 为了便于用户的后续操作,本步骤中通常将屏幕指针的初始位置定位到目标窗口的边界(例如,上边界、或下边界、或左边界、或右边界)。
[0062] 本实施例中,如果当前的屏幕指针不在目标窗口的内部,则将屏幕指针的初始位置定位到目标窗口的左上角。
[0063] 在本发明的其它实施例中,还可以根据用户的操作方向(即屏幕指针的移动方向)确定屏幕指针的初始位置。例如:
[0064] 当用户按下向右的方向键,且屏幕指针的当前位置不在目标窗口的内部时,将屏幕指针的初始位置定位到目标窗口的左边界(包括左上角和左下角),优选方案为定位到左上角;
[0065] 当用户按下向左的方向键,且屏幕指针的当前位置不在目标窗口的内部时,将屏幕指针的初始位置定位到目标窗口的右边界(包括右上角和右下角),优选方案为定位到右上角;
[0066] 当用户按下向下的方向键,且屏幕指针的当前位置不在目标窗口的内部时,将屏幕指针的初始位置定位到目标窗口的上边界(包括左上角和右上角),优选方案为定位到左上角;
[0067] 当用户按下向上的方向键,且屏幕指针的当前位置不在目标窗口的内部时,将屏幕指针的初始位置定位到目标窗口的下边界(包括左下角和右下角),优选方案为定位到左下角。
[0068] 步骤108:在文本坐标映射表中查找与当前屏幕指针位置最接近的界面元素的文本;本步骤可以通过将当前屏幕指针的坐标与文本坐标映射表中各文本的位置坐标做对比来实现;
[0069] 此外,为了便于用户进行后续的操作,本步骤中在查找到与当前屏幕指针位置最接近的界面元素的文本后,还需要将屏幕指针定位到该文本对应的位置。
[0070] 作为优选的方案,本实施例中,可以根据用户的操作方向(即屏幕指针的移动方向)在文本坐标映射表中查找在该方向上与当前屏幕指针位置最接近的界面元素的文本;例如:
[0071] 当用户按下向上的方向键时,如果屏幕指针当前位置所属的列的上方有文本,则获取位于该列的与屏幕指针当前位置最接近的文本;否则将屏幕指针向左(或向右)移动一列或多列并在对应列向上查找,直到查找到文本或屏幕指针达到目标窗口的左边界(或右边界)。
[0072] 当用户按下向下的方向键时,如果屏幕指针当前位置所属的列的下方有文本,则获取位于该列的与屏幕指针当前位置最接近的文本;否则将屏幕指针向右(或向左)移动一列或多列并在对应列向下查找,直到查找到文本或屏幕指针达到目标窗口的右边界(或左边界)。
[0073] 当用户按下向左的方向键时,如果屏幕指针当前位置所属的行的左方有文本,则获取位于该行的与屏幕指针当前位置最接近的文本;否则将屏幕指针向上(或向下)移动一行或多行并在对应行向左查找,直到查找到文本或屏幕指针达到目标窗口的上边界(或下边界)。
[0074] 当用户按下向右的方向键时,如果屏幕指针当前位置所属的行的右方有文本,则获取位于该行的与屏幕指针当前位置最接近的文本;否则将屏幕指针向下(或向上)移动一行或多行并在对应行向右查找,直到查找到文本或屏幕指针达到目标窗口的下边界(或上边界)。
[0075] 步骤109:播放(通常采用朗读的方式)查找到的文本的内容。
[0076] 步骤110:当用户关闭目标程序时,清空文本坐标映射表;
[0077] 当用户关闭目标程序时,通常会触发文本函数拦截链接库的动态链接库卸载事件(DLL_PROCESS_DETACH事件),而对该事件通常在文本函数拦截链接库的入口函数(通常为DllMain函数)中进行处理,因此可以在文本函数拦截链接库的入口函数中判别是否发生动态链接库卸载事件,当发生该事件时清空文本坐标映射表,并将GDI32.DLL中包含的文本输出函数的入口地址修改(恢复)为修改前的系统文本输出函数的入口地址。
[0078] 图1所对应的流程详细地描述了目标窗口文本坐标映射表的生成(步骤101~105)、屏幕指针初始位置的定位(步骤106~107)以及对与屏幕指针当前位置最接近的界面元素的文本进行浏览(步骤108~109)的整个过程。在用户没有进行应用程序/窗口的切换,且没有进行窗口移动和缩放等操作的情况下,采用上述方法可以帮助用户快捷、准确地对软件界面(窗口)的文本信息进行浏览。
[0079] 为了节约系统资源,通常仅生成和使用一个文本坐标映射表,该文本坐标映射表对应当前桌面的活动窗口。在这种情况下,当用户进行应用程序/窗口切换、或进行窗口移动和缩放等操作时,文本坐标映射表中的文本、和/或相应的位置坐标会与当前桌面的活动窗口所对应的信息不一致,需要对文本坐标映射表进行更新操作,下面将简要介绍相应的方法。
[0080] 进行应用程序切换时文本坐标映射表的更新方法
[0081] 当用户启动新的应用程序,该新应用程序的窗口自动被切换为当前桌面的活动窗口,或用户手动进行应用程序切换,将其它应用程序的窗口手动切换为当前桌面的活动窗口时,可采用以下方式之一进行文本坐标映射表的更新:
[0082] 方式一(手动刷新):当用户接收到新的应用程序启动完成的通知、或新的应用程序的窗口已切换为当前桌面的活动窗口的通知后,使用预先设置的文本坐标映射表更新接口完成如下操作:清空当前文本坐标映射表中的内容,将当前活动窗口作为目标窗口重新生成文本坐标映射表(可以采用图1步骤101~105的方法),如果采用图1所示的方法,还需要将原应用程序GDI32.DLL中包含的文本输出函数的入口地址修改(恢复)为修改前的系统文本输出函数的入口地址;
[0083] 上述文本坐标映射表更新接口通常由预先设置的快捷键以及相应的按键处理程序实现。
[0084] 方式二(自动刷新):当接收到系统发送的前景变换消息(例如,EVENT_SYSTEM_FOREGROUND消息),表明新的窗口变为当前的活动窗口时,在相应的消息处理程序中完成如下操作:判断当前的活动窗口所对应的应用程序(进程)与文本坐标映射表所对应的应用程序(进程)是否一致,如果不一致(表明发生了应用程序的切换),则清空当前文本坐标映射表中的内容,将当前活动窗口作为目标窗口重新生成文本坐标映射表(可以采用图1步骤101~105的方法),如果采用图1所示的方法,还需要将原应用程序GDI32.DLL中包含的文本输出函数的入口地址修改(恢复)为修改前的系统文本输出函数的入口地址;
[0085] 采用这种方式刷新文本坐标映射表时需要记录当前文本坐标映射表所对应的应用程序的进程ID,以便进行上述判断。
[0086] 方式三(定时刷新):以预先设定的时间间隔(例如,10秒)重复执行如下操作:判断当前的活动窗口所对应的应用程序(进程)与文本坐标映射表所对应的应用程序(进程)是否一致,如果不一致(表明发生了应用程序的切换),则清空当前文本坐标映射表中的内容,将当前活动窗口作为目标窗口重新生成文本坐标映射表(可以采用图1步骤
101~105的方法),如果采用图1所示的方法,还需要将原应用程序GDI32.DLL中包含的文本输出函数的入口地址修改(恢复)为修改前的系统文本输出函数的入口地址;
[0087] 采用这种方式刷新文本坐标映射表时需要记录当前文本坐标映射表所对应的应用程序的进程ID,以便进行上述判断。
[0088] 进行同一应用程序的不同窗口间切换时文本坐标映射表的更新方法[0089] 方式四(自动刷新):当接收到系统发送的前景变换消息(例如,EVENT_SYSTEM_FOREGROUND消息),表明新的窗口变为当前的活动窗口时,在相应的消息处理程序中完成如下操作:判断当前的活动窗口所对应的应用程序(进程)与文本坐标映射表所对应的应用程序(进程)是否一致,如果一致(表明发生了同一应用程序的窗口切换),则清空当前文本坐标映射表中的内容,强制刷新窗口界面(可以通过在窗口表面绘制透明窗口等方式实现),以触发步骤105,完成当前活动窗口(即新的目标窗口)的文本坐标映射表的重新生成;
[0090] 采用这种方式刷新文本坐标映射表时需要记录当前文本坐标映射表所对应的应用程序的进程ID,以便进行上述判断。
[0091] 方式五(定时刷新):以预先设定的时间间隔(例如,10秒)重复执行如下操作:判断当前的活动窗口所对应的应用程序(进程)及窗口与文本坐标映射表所对应的应用程序(进程)及窗口是否一致,如果应用程序一致且窗口不一致(表明发生了同一应用程序的窗口切换),则清空当前文本坐标映射表中的内容,并强制刷新当前活动窗口(可以通过在窗口表面绘制透明窗口等方式实现),以触发步骤105,完成当前活动窗口(即新的目标窗口)的文本坐标映射表的重新生成;
[0092] 采用这种方式刷新文本坐标映射表时需要记录当前文本坐标映射表所对应的应用程序的进程ID,以及对应的窗口句柄,以便进行上述判断。
[0093] 进行窗口移动或缩放操作时文本坐标映射表的更新方法
[0094] 当用户对目标窗口进行移动或缩放操作时,目标窗口的文本及其对应的位置坐标会发生变化,可采用以下方式之一进行文本坐标映射表的更新:
[0095] 方式六(自动刷新):当接收到系统发送的目标窗口的拖放开始消息(例如,EVENT_SYSTEM_DRAGDROPSTART消息),表明用户开始进行窗口移动或缩放操作时,在相应的消息处理程序中完成如下操作:清空当前文本坐标映射表中的内容;当接收到系统发送的目标窗口的拖放完成消息(例如,EVENT_SYSTEM_DRAGDROPEND消息),表明用户已完成窗口移动或缩放操作时,在相应的消息处理程序中完成如下操作:强制刷新窗口界面(可以通过在窗口表面绘制透明窗口等方式实现),以触发步骤105,完成文本坐标映射表的重新生成。
[0096] 方式七(定时刷新):以预先设定的时间间隔(例如,10秒)重复执行如下操作:判断当前的活动窗口所对应的应用程序(进程)及窗口与文本坐标映射表所对应的应用程序(进程)及窗口是否一致,如果都一致(表明未发生应用程序及窗口的切换),则清空当前文本坐标映射表中的内容,并强制刷新当前活动窗口(可以通过在窗口表面绘制透明窗口等方式实现),以触发步骤105,完成文本坐标映射表的重新生成;
[0097] 采用这种方式刷新文本坐标映射表时需要记录当前文本坐标映射表所对应的应用程序的进程ID,以及对应的窗口句柄,以便进行上述判断。
[0098] 此外,采用方式七进行文本坐标映射表的刷新还可以防止窗口内部的局部刷新所造成的文本坐标映射表信息错误。
[0099] 需要注意的是,本发明的上述实施例通过拦截API(ApplicationProgramming Interface,应用程序编程接口)调用,即拦截系统文本输出函数调用的方式来获取系统文本输出函数的函数调用参数,并使用系统文本输出函数的函数调用参数(包括文本及相应的位置坐标)来生成文本坐标映射表;在本发明的其它实施例中,还可以采用其它方式来获取系统文本输出函数的函数调用参数,例如:直接改写(替换)系统文本输出函数,在系统文本输出函数中向当前活动窗口的文本坐标映射表中写入该函数的调用参数(包括文本及相应的位置坐标)。
[0100] 此外,除了本发明实施例所描述的API拦截方法外,还可以采用设置钩子函数(SetWindowsHookEx)、修改注册表等方式进行API的拦截,具体方法请参阅相关文档。
[0101] 此外,对于应用程序设计者,也可以采用如下方式生成文本坐标映射表:在应用程序中加入用于生成文本坐标映射表的代码,例如,在进行窗口绘制时(通常是对ON_PAINT消息进行处理的函数中)将待绘制的文本及相应的位置坐标自行写入文本坐标映射表。
[0102] 与现有技术相比,本发明的有益效果体现在如下几个方面:
[0103] (1)高效性:本发明实现了Windows环境下基于API拦截的辅助用户(通常为盲人用户)对软件界面文本信息进行浏览方法,该方法使用户通过快捷键可以在上下左右四个方向迅速浏览软件界面上文字信息,这种操作方式很好地利用了现有软件布局,让盲人用户的操作习惯与正常用户渐趋一致,更高效地操作使用软件;
[0104] (2)易用性:本发明的方法使用了较少的快捷键,操作起来更加方便和人性化,大大地降低了盲人用户进行软件操作的门槛;
[0105] (3)通用性:本发明的方法无需采用MSAA技术,更广泛地支持各种Windows平台的软件,使得盲人用户在使用软件时可以有更多的选择。