專利名稱:一種軟件界面文本信息的輔助瀏覽方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機軟件技術(shù)領(lǐng)域,尤其涉及一種軟件界面文本信息的輔助瀏覽 方法。
背景技術(shù):
隨著計算機軟硬件技術(shù)的飛速進步,當(dāng)今社會已經(jīng)進入了一個信息化的時代, 計算機、因特網(wǎng)、移動通訊已經(jīng)成為人們?nèi)粘I?、學(xué)習(xí)和工作的重要組成部分。在信 息社會中,通過計算機獲取信息和交流信息已經(jīng)成為人們工作和生活的基本手段之一, 因而信息平等已經(jīng)成為信息社會中人人平等的基礎(chǔ)。所謂信息平等就是任何人在任何情 況下都能平等、方便、無障礙地獲取信息、交流信息和利用信息。信息無障礙化是一項民生工程,是國家和社會體現(xiàn)人文關(guān)懷精神的必然要求, 是建設(shè)全面信息化社會的基本內(nèi)容,是實現(xiàn)行業(yè)全面、協(xié)調(diào)且可持續(xù)發(fā)展的必要途徑, 也是縮小數(shù)字鴻溝、建立公平信息社會的一項重要工作。目前,研究人員已開發(fā)出多種用于消除盲人使用計算機時存在的各種障礙的技 術(shù),MSAA (Microsoft Active Accessibility,微軟主動式輔助)技術(shù)就是其中之一。對于符 合MSAA技術(shù)標(biāo)準(zhǔn)的應(yīng)用程序,當(dāng)盲人用戶通過輸入設(shè)備(鍵盤、鼠標(biāo)等)將屏幕指針 定位到應(yīng)用程序界面的某一位置時,應(yīng)用程序或者讀屏軟件可以朗讀出該位置所包含的 文本。例如,屏幕指針的當(dāng)前位置為按鍵時,應(yīng)用程序可以讀出該按鍵上顯示的文字。同時,為了滿足用戶對軟件產(chǎn)品的易用性、擴展性和個性化的需求,軟件界面 的開發(fā)越來越強調(diào)高效、易于擴展和藝術(shù)化,人們常見的標(biāo)準(zhǔn)化界面所占的比重在不斷 降低。例如,中國的軟件開發(fā)商騰訊、迅雷等開發(fā)的軟件客戶端產(chǎn)品多采用上述方式來 設(shè)計軟件界面,從而很好地將軟件界面與功能邏輯進行分離,同時易于實現(xiàn)各種界面效 果,如換膚,透明等。但是,這種軟件界面開發(fā)技術(shù)并不支持MSAA技術(shù)標(biāo)準(zhǔn),導(dǎo)致現(xiàn) 有的讀屏軟件無法獲取這些軟件中包含的文本信息,盲人用戶無法操作這些軟件,給盲 人使用計算機帶來很大的不便。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是,克服現(xiàn)有技術(shù)的不足,提供一種在不需要 MSAA等技術(shù)標(biāo)準(zhǔn)支持的情況下,實現(xiàn)軟件界面文本信息輔助瀏覽的方法。為了解決上述問題,本發(fā)明提供一種軟件界面文本信息的輔助瀏覽方法,該方 法包括如下步驟A生成目標(biāo)窗口的文本坐標(biāo)映射表;所述文本坐標(biāo)映射表中包含所述目標(biāo)窗 口上顯示的文本及相應(yīng)的位置坐標(biāo);B用戶使用輸入設(shè)備移動屏幕指針后,在所述文本坐標(biāo)映射表中查找與屏幕 指針的當(dāng)前位置最接近的界面元素的文本;C 播放查找到的文本的內(nèi)容。
此外,在所述步驟B之后,還包含如下步驟如果在所述文本坐標(biāo)映射表中查找到與屏幕指針的當(dāng)前位置最接近的界面元素 的文本,則根據(jù)所述文本坐標(biāo)映射表中記錄的該文本所對應(yīng)的位置坐標(biāo),將屏幕指針定 位到相應(yīng)的位置。此外,在所述步驟B中,采用如下方式在所述文本坐標(biāo)映射表中查找與屏幕指 針的當(dāng)前位置最接近的界面元素的文本根據(jù)屏幕指針的移動方向,在所述文本坐標(biāo)映射表中查找該移動方向上與屏幕 指針的當(dāng)前位置最接近的界面元素的文本。此外,在所述步驟B中,采用如下方式實現(xiàn)根據(jù)屏幕指針的移動方向,在所述 文本坐標(biāo)映射表中查找該移動方向上與屏幕指針的當(dāng)前位置最接近的界面元素的文本當(dāng)屏幕指針的移動方向為向上時,如果屏幕指針當(dāng)前位置所屬的列的上方有文 本,則獲取位于該列的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向左或向右 移動一列或多列并在對應(yīng)列向上查找,直到查找到文本或屏幕指針達到所述目標(biāo)窗口的 左邊界或右邊界;當(dāng)屏幕指針的移動方向為向下時,如果屏幕指針當(dāng)前位置所屬的列的下方有文 本,則獲取位于該列的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向右或向左 移動一列或多列并在對應(yīng)列向下查找,直到查找到文本或屏幕指針達到所述目標(biāo)窗口的 右邊界或左邊界;當(dāng)屏幕指針的移動方向為向左時,如果屏幕指針當(dāng)前位置所屬的行的左方有文 本,則獲取位于該行的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向上或向下 移動一行或多行并在對應(yīng)行向左查找,直到查找到文本或屏幕指針達到所述目標(biāo)窗口的 上邊界或下邊界;當(dāng)屏幕指針的移動方向為向右時,如果屏幕指針當(dāng)前位置所屬的行的右方有文 本,則獲取位于該行的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向下或向上 移動一行或多行并在對應(yīng)行向右查找,直到查找到文本或屏幕指針達到目標(biāo)窗口的下邊 界或上邊界。此外,在所述步驟B中,用戶使用輸入設(shè)備移動屏幕指針之后、在所述文本 坐標(biāo)映射表中查找與屏幕指針的當(dāng)前位置最接近的界面元素的文本之前,還包括如下步 驟Bi:判斷屏幕指針的當(dāng)前位置是否在所述目標(biāo)窗口內(nèi)部,如果不在,則將屏幕 指針的當(dāng)前位置定位到所述目標(biāo)窗口的內(nèi)部。此外,在所述步驟Bl中,所述目標(biāo)窗口的內(nèi)部為所述目標(biāo)窗口的邊界。此外,在所述步驟Bl中,所述目標(biāo)窗口的邊界為所述目標(biāo)窗口的左上角。此外,在所述步驟Bl中,如果判定屏幕指針的當(dāng)前位置不在所述目標(biāo)窗口內(nèi) 部,則采用如下方式之一定位屏幕指針的當(dāng)前位置當(dāng)用戶向右移動屏幕指針時,將屏幕指針的初始位置定位到所述目標(biāo)窗口的左 邊界;當(dāng)用戶向左移動屏幕指針時,將屏幕指針的初始位置定位到所述目標(biāo)窗口的右 邊界;
當(dāng)用戶向下移動屏幕指針時,將屏幕指針的初始位置定位到所述目標(biāo)窗口的上 邊界;當(dāng)用戶向上移動屏幕指針時,將屏幕指針的初始位置定位到所述目標(biāo)窗口的下 邊界。此外,在所述步驟A之后,還包括如下步驟當(dāng)接收到前景變換消息時,清空所述文本坐標(biāo)映射表中的內(nèi)容,將當(dāng)前活動窗 口作為新的目標(biāo)窗口,生成該新的目標(biāo)窗口的文本坐標(biāo)映射表。此外,在所述步驟A之后,還包括如下步驟當(dāng)接收到所述目標(biāo)窗口的拖放開始消息時,清空所述文本坐標(biāo)映射表中的內(nèi) 容;當(dāng)接收到所述目標(biāo)窗口的拖放完成消息時,重新生成所述目標(biāo)窗口的文本坐標(biāo) 映射表。此外,在所述步驟A之后,還包括如下步驟以預(yù)先設(shè)定的時間間隔重復(fù)執(zhí)行如下操作清空所述文本坐標(biāo)映射表中的內(nèi) 容,重新生成所述目標(biāo)窗口的文本坐標(biāo)映射表、或?qū)?dāng)前活動窗口作為新的目標(biāo)窗口, 生成該新的目標(biāo)窗口的文本坐標(biāo)映射表。綜上所述,本發(fā)明提供了一種不依賴MSAA技術(shù)實現(xiàn)的輔助用戶瀏覽軟件界 面文本信息的方法,該方法通過獲取軟件界面上顯示的文本及相應(yīng)的位置坐標(biāo)來生成文 本坐標(biāo)映射表,并使用文本坐標(biāo)映射表查找與當(dāng)前屏幕指針位置最接近的界面元素的文 本,進而實現(xiàn)輔助用戶瀏覽軟件界面文本信息的功能。該方法可以讓用戶快捷地在軟件 界面上的各文本信息間進行跳轉(zhuǎn)、瀏覽。此外,本發(fā)明的方法使用了很少的快捷鍵,操 作起來更加方便和人性化,大大降低了盲人用戶操作軟件的門檻。本發(fā)明的方法具有很 好的通用性,可以支持各種基于Windows(視窗操作系統(tǒng))環(huán)境的軟件。
圖1是本發(fā)明實施例軟件界面文本信息的輔助瀏覽方法的流程圖。
具體實施例方式本發(fā)明的核心是,生成包含軟件界面上顯示的文本及相應(yīng)的位置坐標(biāo)的文本坐 標(biāo)映射表,當(dāng)用戶使用輸入設(shè)備移動屏幕指針時,在文本坐標(biāo)映射表中查找與當(dāng)前屏幕 指針位置最接近的界面元素的文本,并播放查找到的文本的內(nèi)容。下面將結(jié)合附圖和實施例對本發(fā)明進行詳細(xì)描述。圖1是本發(fā)明實施例軟件界面文本信息的輔助瀏覽方法的流程圖。如圖1所示, 該方法包含如下步驟步驟101 獲得用戶(通常為盲人用戶)當(dāng)前正在使用的軟件(可稱為目標(biāo)軟件 或目標(biāo)程序)的系統(tǒng)運行信息;上述系統(tǒng)運行信息包括進程ID (Identification,標(biāo)識符),窗口句柄。上述進程ID可用于在后續(xù)步驟中進行遠(yuǎn)程線程注入DLL (Dynamic LinkLibrary,
動態(tài)鏈接庫)的操作;上述窗口句柄可用于獲取目標(biāo)程序窗口的位置信息。
步驟102 執(zhí)行遠(yuǎn)程線程注入DLL的操作;具體地說,本步驟中可以通過目標(biāo)程序的進程ID,在對應(yīng)的進程(可稱為目標(biāo) 進程)中創(chuàng)建遠(yuǎn)程線程,并且在該遠(yuǎn)程線程中加載并初始化用于攔截文本輸出函數(shù)的動 態(tài)鏈接庫(可以稱為文本函數(shù)攔截鏈接庫)。步驟103 在文本函數(shù)攔截鏈接庫中執(zhí)行以下操作在目標(biāo)進程的DLL導(dǎo)入表 項中找到名稱為GDI32.DLL的項,將其中包含的由系統(tǒng)提供的文本輸出函數(shù)(可稱為系 統(tǒng)文本輸出函數(shù))的入口地址修改為相應(yīng)的自定義文本輸出函數(shù)的入口地址;并記錄修 改前的系統(tǒng)文本輸出函數(shù)的入口地址;上述系統(tǒng)文本輸出函數(shù)包括TextOutA,TextOutW,ExtTextOutA, ExtTextOutW和ScriptShape等;相應(yīng)的自定義文本輸出函數(shù)可以記作MyTextOutA, MyTextOutW, MyExtTextOutA, MyExtTextOutW 禾口 MyScriptShape 等。步驟104:主動刷新目標(biāo)程序的目標(biāo)窗口(通常為當(dāng)前桌面的活動窗口,或稱為 前景窗口),或等待目標(biāo)窗口被刷新(可以稱為被動刷新,例如,目標(biāo)窗口由非活動窗口 被切換為活動窗口,目標(biāo)窗口將被刷新),以引發(fā)系統(tǒng)對文本輸出函數(shù)的調(diào)用。上述主動刷新和被動刷新的刷新范圍可以是整個目標(biāo)窗口,也可以是目標(biāo)窗口 的一部分。步驟105:當(dāng)系統(tǒng)調(diào)用系統(tǒng)文本輸出函數(shù)以便對窗口中的包含文本的界面元素 進行繪制時,由于在步驟103中已將系統(tǒng)文本輸出函數(shù)的入口地址修改為自定義文本輸 出函數(shù)的入口地址,因此引發(fā)了系統(tǒng)對自定義文本輸出函數(shù)的調(diào)用,自定義文本輸出函 數(shù)根據(jù)系統(tǒng)傳遞的函數(shù)調(diào)用參數(shù),生成目標(biāo)窗口的文本坐標(biāo)映射表;上述包含文本的界面元素可以是標(biāo)題欄、菜單、工具欄、地址欄、客戶區(qū)寸。上述函數(shù)調(diào)用參數(shù)中包含文本及相應(yīng)的相對位置坐標(biāo)。上述相對位置坐標(biāo)是 文本相對于目標(biāo)窗口的位置坐標(biāo)(通常為相對于目標(biāo)窗口左上角的位置坐標(biāo))。上述文本坐標(biāo)映射表中包含了目標(biāo)窗口中文本,以及該文本所對應(yīng)的位置坐 標(biāo)。在本實施例中,上述位置坐標(biāo)為相對位置坐標(biāo)。在本發(fā)明的其它實施例中,上述位置坐標(biāo)可以是絕對位置坐標(biāo)(即文本相對于 桌面的位置坐標(biāo))。文本的絕對位置坐標(biāo)可以根據(jù)文本的相對位置坐標(biāo)和目標(biāo)窗口的位置 信息換算得出。本實施例中,在自定義文本輸出函數(shù)中,將文本以及對應(yīng)的位置坐標(biāo)寫入文本 坐標(biāo)映射表后,可以調(diào)用對應(yīng)的系統(tǒng)文本輸出函數(shù)完成后續(xù)的文本輸出操作(即在目標(biāo) 窗口的特定位置繪制相應(yīng)的文本)。當(dāng)然,也可以不調(diào)用對應(yīng)的系統(tǒng)文本輸出函數(shù),由自 定義文本輸出函數(shù)完成后續(xù)的文本輸出操作。需要注意的是,本步驟中系統(tǒng)可能會多次調(diào)用一個或多個系統(tǒng)文本輸出函數(shù), 從而會多次調(diào)用一個或多個自定義文本輸出函數(shù),每次調(diào)用都會在文本坐標(biāo)映射表中寫 入一條記錄,最終生成完整的目標(biāo)窗口文本坐標(biāo)映射表。步驟106 當(dāng)用戶使用輸入設(shè)備(例如,鍵盤)進行移動屏幕指針的操作后(例 如,按下某一方向鍵時),獲取屏幕指針(例如,鼠標(biāo)指針、光標(biāo)等)的當(dāng)前位置,并判 斷當(dāng)前的屏幕指針是否在目標(biāo)窗口的內(nèi)部,如果不在,則執(zhí)行步驟107;否則跳轉(zhuǎn)至步驟 108 ;本實施例中,可以通過目標(biāo)窗口的窗口句柄獲得目標(biāo)窗口的位置信息,并根據(jù) 屏幕指針的當(dāng)前位置和目標(biāo)窗口的位置信息來判斷屏幕指針是否在目標(biāo)窗口的內(nèi)部。上述窗口的位置信息通常為窗口矩形左上角的坐標(biāo),以及窗口的長寬值;當(dāng) 然,根據(jù)系統(tǒng)的不同,也可以用其它方式來表示窗口的位置信息,例如,用矩形左上角 和右下角的坐標(biāo)來表示矩形窗口的位置信息。步驟107:將屏幕指針的初始位置(當(dāng)前位置)定位到目標(biāo)窗口的內(nèi)部(包括窗 口的邊界);為了便于用戶的后續(xù)操作,本步驟中通常將屏幕指針的初始位置定位到目標(biāo)窗 口的邊界(例如,上邊界、或下邊界、或左邊界、或右邊界)。本實施例中,如果當(dāng)前的屏幕指針不在目標(biāo)窗口的內(nèi)部,則將屏幕指針的初始 位置定位到目標(biāo)窗口的左上角。在本發(fā)明的其它實施例中,還可以根據(jù)用戶的操作方向(即屏幕指針的移動方 向)確定屏幕指針的初始位置。例如當(dāng)用戶按下向右的方向鍵,且屏幕指針的當(dāng)前位置不在目標(biāo)窗口的內(nèi)部時,將 屏幕指針的初始位置定位到目標(biāo)窗口的左邊界(包括左上角和左下角),優(yōu)選方案為定位 到左上角;當(dāng)用戶按下向左的方向鍵,且屏幕指針的當(dāng)前位置不在目標(biāo)窗口的內(nèi)部時,將 屏幕指針的初始位置定位到目標(biāo)窗口的右邊界(包括右上角和右下角),優(yōu)選方案為定位 到右上角;當(dāng)用戶按下向下的方向鍵,且屏幕指針的當(dāng)前位置不在目標(biāo)窗口的內(nèi)部時,將 屏幕指針的初始位置定位到目標(biāo)窗口的上邊界(包括左上角和右上角),優(yōu)選方案為定位 到左上角;當(dāng)用戶按下向上的方向鍵,且屏幕指針的當(dāng)前位置不在目標(biāo)窗口的內(nèi)部時,將 屏幕指針的初始位置定位到目標(biāo)窗口的下邊界(包括左下角和右下角),優(yōu)選方案為定位 到左下角。步驟108 在文本坐標(biāo)映射表中查找與當(dāng)前屏幕指針位置最接近的界面元素的 文本;本步驟可以通過將當(dāng)前屏幕指針的坐標(biāo)與文本坐標(biāo)映射表中各文本的位置坐標(biāo)做 對比來實現(xiàn);此外,為了便于用戶進行后續(xù)的操作,本步驟中在查找到與當(dāng)前屏幕指針位置 最接近的界面元素的文本后,還需要將屏幕指針定位到該文本對應(yīng)的位置。作為優(yōu)選的方案,本實施例中,可以根據(jù)用戶的操作方向(即屏幕指針的移動 方向)在文本坐標(biāo)映射表中查找在該方向上與當(dāng)前屏幕指針位置最接近的界面元素的文 本;例如當(dāng)用戶按下向上的方向鍵時,如果屏幕指針當(dāng)前位置所屬的列的上方有文本, 則獲取位于該列的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向左(或向右)移 動一列或多列并在對應(yīng)列向上查找,直到查找到文本或屏幕指針達到目標(biāo)窗口的左邊界 (或右邊界)。當(dāng)用戶按下向下的方向鍵時,如果屏幕指針當(dāng)前位置所屬的列的下方有文本,則獲取位于該列的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向右(或向左)移 動一列或多列并在對應(yīng)列向下查找,直到查找到文本或屏幕指針達到目標(biāo)窗口的右邊界 (或左邊界)。當(dāng)用戶按下向左的方向鍵時,如果屏幕指針當(dāng)前位置所屬的行的左方有文本, 則獲取位于該行的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向上(或向下)移 動一行或多行并在對應(yīng)行向左查找,直到查找到文本或屏幕指針達到目標(biāo)窗口的上邊界 (或下邊界)。當(dāng)用戶按下向右的方向鍵時,如果屏幕指針當(dāng)前位置所屬的行的右方有文本, 則獲取位于該行的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向下(或向上)移 動一行或多行并在對應(yīng)行向右查找,直到查找到文本或屏幕指針達到目標(biāo)窗口的下邊界 (或上邊界)。步驟109 播放(通常采用朗讀的方式)查找到的文本的內(nèi)容。步驟110:當(dāng)用戶關(guān)閉目標(biāo)程序時,清空文本坐標(biāo)映射表;當(dāng)用戶關(guān)閉目標(biāo)程序時,通常會觸發(fā)文本函數(shù)攔截鏈接庫的動態(tài)鏈接庫卸載事 件(DLL_PROCESS_DETACH事件),而對該事件通常在文本函數(shù)攔截鏈接庫的入口函數(shù) (通常為DllMain函數(shù))中進行處理,因此可以在文本函數(shù)攔截鏈接庫的入口函數(shù)中判別 是否發(fā)生動態(tài)鏈接庫卸載事件,當(dāng)發(fā)生該事件時清空文本坐標(biāo)映射表,并將GDI32.DLL 中包含的文本輸出函數(shù)的入口地址修改(恢復(fù))為修改前的系統(tǒng)文本輸出函數(shù)的入口地 址。圖1所對應(yīng)的流程詳細(xì)地描述了目標(biāo)窗口文本坐標(biāo)映射表的生成(步驟101 105)、屏幕指針初始位置的定位(步驟106 107)以及對與屏幕指針當(dāng)前位置最接近的 界面元素的文本進行瀏覽(步驟108 109)的整個過程。在用戶沒有進行應(yīng)用程序/窗 口的切換,且沒有進行窗口移動和縮放等操作的情況下,采用上述方法可以幫助用戶快 捷、準(zhǔn)確地對軟件界面(窗口)的文本信息進行瀏覽。為了節(jié)約系統(tǒng)資源,通常僅生成和使用一個文本坐標(biāo)映射表,該文本坐標(biāo)映射 表對應(yīng)當(dāng)前桌面的活動窗口。在這種情況下,當(dāng)用戶進行應(yīng)用程序/窗口切換、或進行 窗口移動和縮放等操作時,文本坐標(biāo)映射表中的文本、和/或相應(yīng)的位置坐標(biāo)會與當(dāng)前 桌面的活動窗口所對應(yīng)的信息不一致,需要對文本坐標(biāo)映射表進行更新操作,下面將簡 要介紹相應(yīng)的方法。進行應(yīng)用程序切換時文本坐標(biāo)映射表的更新方法當(dāng)用戶啟動新的應(yīng)用程序,該新應(yīng)用程序的窗口自動被切換為當(dāng)前桌面的活動 窗口,或用戶手動進行應(yīng)用程序切換,將其它應(yīng)用程序的窗口手動切換為當(dāng)前桌面的活 動窗口時,可采用以下方式之一進行文本坐標(biāo)映射表的更新方式一(手動刷新)當(dāng)用戶接收到新的應(yīng)用程序啟動完成的通知、或新的應(yīng)用 程序的窗口已切換為當(dāng)前桌面的活動窗口的通知后,使用預(yù)先設(shè)置的文本坐標(biāo)映射表更 新接口完成如下操作清空當(dāng)前文本坐標(biāo)映射表中的內(nèi)容,將當(dāng)前活動窗口作為目標(biāo)窗 口重新生成文本坐標(biāo)映射表(可以采用圖1步驟101 105的方法),如果采用圖1所示 的方法,還需要將原應(yīng)用程序GDI32.DLL中包含的文本輸出函數(shù)的入口地址修改(恢復(fù)) 為修改前的系統(tǒng)文本輸出函數(shù)的入口地址;
9
上述文本坐標(biāo)映射表更新接口通常由預(yù)先設(shè)置的快捷鍵以及相應(yīng)的按鍵處理程 序?qū)崿F(xiàn)。方式二(自動刷新)當(dāng)接收到系統(tǒng)發(fā)送的前景變換消息(例如,EVENT_ SYSTEM_FOREGROUND消息),表明新的窗口變?yōu)楫?dāng)前的活動窗口時,在相應(yīng)的消息 處理程序中完成如下操作判斷當(dāng)前的活動窗口所對應(yīng)的應(yīng)用程序(進程)與文本坐標(biāo)映 射表所對應(yīng)的應(yīng)用程序(進程)是否一致,如果不一致(表明發(fā)生了應(yīng)用程序的切換), 則清空當(dāng)前文本坐標(biāo)映射表中的內(nèi)容,將當(dāng)前活動窗口作為目標(biāo)窗口重新生成文本坐標(biāo) 映射表(可以采用圖1步驟101 105的方法),如果采用圖1所示的方法,還需要將原 應(yīng)用程序GDI32.DLL中包含的文本輸出函數(shù)的入口地址修改(恢復(fù))為修改前的系統(tǒng)文 本輸出函數(shù)的入口地址;采用這種方式刷新文本坐標(biāo)映射表時需要記錄當(dāng)前文本坐標(biāo)映射表所對應(yīng)的應(yīng) 用程序的進程ID,以便進行上述判斷。方式三(定時刷新)以預(yù)先設(shè)定的時間間隔(例如,10秒)重復(fù)執(zhí)行如下操 作判斷當(dāng)前的活動窗口所對應(yīng)的應(yīng)用程序(進程)與文本坐標(biāo)映射表所對應(yīng)的應(yīng)用程序 (進程)是否一致,如果不一致(表明發(fā)生了應(yīng)用程序的切換),則清空當(dāng)前文本坐標(biāo)映 射表中的內(nèi)容,將當(dāng)前活動窗口作為目標(biāo)窗口重新生成文本坐標(biāo)映射表(可以采用圖1步 驟101 105的方法),如果采用圖1所示的方法,還需要將原應(yīng)用程序GDI32.DLL中包 含的文本輸出函數(shù)的入口地址修改(恢復(fù))為修改前的系統(tǒng)文本輸出函數(shù)的入口地址;采用這種方式刷新文本坐標(biāo)映射表時需要記錄當(dāng)前文本坐標(biāo)映射表所對應(yīng)的應(yīng) 用程序的進程ID,以便進行上述判斷。進行同一應(yīng)用程序的不同窗口間切換時文本坐標(biāo)映射表的更新方法方式四(自動刷新)當(dāng)接收到系統(tǒng)發(fā)送的前景變換消息(例如,EVENT_ SYSTEM_FOREGROUND消息),表明新的窗口變?yōu)楫?dāng)前的活動窗口時,在相應(yīng)的消息 處理程序中完成如下操作判斷當(dāng)前的活動窗口所對應(yīng)的應(yīng)用程序(進程)與文本坐標(biāo)映 射表所對應(yīng)的應(yīng)用程序(進程)是否一致,如果一致(表明發(fā)生了同一應(yīng)用程序的窗口切 換),則清空當(dāng)前文本坐標(biāo)映射表中的內(nèi)容,強制刷新窗口界面(可以通過在窗口表面繪 制透明窗口等方式實現(xiàn)),以觸發(fā)步驟105,完成當(dāng)前活動窗口(即新的目標(biāo)窗口)的文 本坐標(biāo)映射表的重新生成;采用這種方式刷新文本坐標(biāo)映射表時需要記錄當(dāng)前文本坐標(biāo)映射表所對應(yīng)的應(yīng) 用程序的進程ID,以便進行上述判斷。方式五(定時刷新)以預(yù)先設(shè)定的時間間隔(例如,10秒)重復(fù)執(zhí)行如下操 作判斷當(dāng)前的活動窗口所對應(yīng)的應(yīng)用程序(進程)及窗口與文本坐標(biāo)映射表所對應(yīng)的應(yīng) 用程序(進程)及窗口是否一致,如果應(yīng)用程序一致且窗口不一致(表明發(fā)生了同一應(yīng)用 程序的窗口切換),則清空當(dāng)前文本坐標(biāo)映射表中的內(nèi)容,并強制刷新當(dāng)前活動窗口(可 以通過在窗口表面繪制透明窗口等方式實現(xiàn)),以觸發(fā)步驟105,完成當(dāng)前活動窗口(即 新的目標(biāo)窗口)的文本坐標(biāo)映射表的重新生成;采用這種方式刷新文本坐標(biāo)映射表時需要記錄當(dāng)前文本坐標(biāo)映射表所對應(yīng)的應(yīng) 用程序的進程ID,以及對應(yīng)的窗口句柄,以便進行上述判斷。進行窗口移動或縮放操作時文本坐標(biāo)映射表的更新方法
當(dāng)用戶對目標(biāo)窗口進行移動或縮放操作時,目標(biāo)窗口的文本及其對應(yīng)的位置坐 標(biāo)會發(fā)生變化,可采用以下方式之一進行文本坐標(biāo)映射表的更新方式六(自動刷新)當(dāng)接收到系統(tǒng)發(fā)送的目標(biāo)窗口的拖放開始消息(例如, EVENT_SYSTEM_DRAGDROPSTART消息),表明用戶開始進行窗口移動或縮放操作 時,在相應(yīng)的消息處理程序中完成如下操作清空當(dāng)前文本坐標(biāo)映射表中的內(nèi)容;當(dāng)接 收到系統(tǒng)發(fā)送的目標(biāo)窗口的拖放完成消息(例如,EVENT_SYSTEM_DRAGDROPEND消 息),表明用戶已完成窗口移動或縮放操作時,在相應(yīng)的消息處理程序中完成如下操作 強制刷新窗口界面(可以通過在窗口表面繪制透明窗口等方式實現(xiàn)),以觸發(fā)步驟105, 完成文本坐標(biāo)映射表的重新生成。方式七(定時刷新)以預(yù)先設(shè)定的時間間隔(例如,10秒)重復(fù)執(zhí)行如下操 作判斷當(dāng)前的活動窗口所對應(yīng)的應(yīng)用程序(進程)及窗口與文本坐標(biāo)映射表所對應(yīng)的應(yīng) 用程序(進程)及窗口是否一致,如果都一致(表明未發(fā)生應(yīng)用程序及窗口的切換),則 清空當(dāng)前文本坐標(biāo)映射表中的內(nèi)容,并強制刷新當(dāng)前活動窗口(可以通過在窗口表面繪 制透明窗口等方式實現(xiàn)),以觸發(fā)步驟105,完成文本坐標(biāo)映射表的重新生成;采用這種方式刷新文本坐標(biāo)映射表時需要記錄當(dāng)前文本坐標(biāo)映射表所對應(yīng)的應(yīng) 用程序的進程ID,以及對應(yīng)的窗口句柄,以便進行上述判斷。此外,采用方式七進行文本坐標(biāo)映射表的刷新還可以防止窗口內(nèi)部的局部刷新 所造成的文本坐標(biāo)映射表信息錯誤。需要注意的是,本發(fā)明的上述實施例通過攔截API (ApplicationProgramming Interface,應(yīng)用程序編程接口)調(diào)用,即攔截系統(tǒng)文本輸出函數(shù)調(diào)用的方式來獲取系統(tǒng)文 本輸出函數(shù)的函數(shù)調(diào)用參數(shù),并使用系統(tǒng)文本輸出函數(shù)的函數(shù)調(diào)用參數(shù)(包括文本及相 應(yīng)的位置坐標(biāo))來生成文本坐標(biāo)映射表;在本發(fā)明的其它實施例中,還可以采用其它方 式來獲取系統(tǒng)文本輸出函數(shù)的函數(shù)調(diào)用參數(shù),例如直接改寫(替換)系統(tǒng)文本輸出函 數(shù),在系統(tǒng)文本輸出函數(shù)中向當(dāng)前活動窗口的文本坐標(biāo)映射表中寫入該函數(shù)的調(diào)用參數(shù) (包括文本及相應(yīng)的位置坐標(biāo))。此外,除了本發(fā)明實施例所描述的API攔截方法外,還可以采用設(shè)置鉤子函數(shù) (SetWindowsHookEx),修改注冊表等方式進行API的攔截,具體方法請參閱相關(guān)文檔。此外,對于應(yīng)用程序設(shè)計者,也可以采用如下方式生成文本坐標(biāo)映射表在 應(yīng)用程序中加入用于生成文本坐標(biāo)映射表的代碼,例如,在進行窗口繪制時(通常是對 ON_PAINT消息進行處理的函數(shù)中)將待繪制的文本及相應(yīng)的位置坐標(biāo)自行寫入文本坐標(biāo) 映射表。與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果體現(xiàn)在如下幾個方面(1)高效性本發(fā)明實現(xiàn)了 Windows環(huán)境下基于API攔截的輔助用戶(通常為盲 人用戶)對軟件界面文本信息進行瀏覽方法,該方法使用戶通過快捷鍵可以在上下左右 四個方向迅速瀏覽軟件界面上文字信息,這種操作方式很好地利用了現(xiàn)有軟件布局,讓 盲人用戶的操作習(xí)慣與正常用戶漸趨一致,更高效地操作使用軟件;(2)易用性本發(fā)明的方法使用了較少的快捷鍵,操作起來更加方便和人性 化,大大地降低了盲人用戶進行軟件操作的門檻;(3)通用性本發(fā)明的方法無需采用MSAA技術(shù),更廣泛地支持各種Windows平臺的軟件,使得盲人用戶在使用軟件時可以有更多的選擇。
權(quán)利要求
1.一種軟件界面文本信息的輔助瀏覽方法,其特征在于,該方法包括如下步驟A生成目標(biāo)窗口的文本坐標(biāo)映射表;所述文本坐標(biāo)映射表中包含所述目標(biāo)窗口上 顯示的文本及相應(yīng)的位置坐標(biāo);B用戶使用輸入設(shè)備移動屏幕指針后,在所述文本坐標(biāo)映射表中查找與屏幕指針 的當(dāng)前位置最接近的界面元素的文本;C播放查找到的文本的內(nèi)容。
2.如權(quán)利要求1所述的方法,其特征在于,在所述步驟B之后,還包含如下步驟如果在所述文本坐標(biāo)映射表中查找到與屏幕指針的當(dāng)前位置最接近的界面元素的文 本,則根據(jù)所述文本坐標(biāo)映射表中記錄的該文本所對應(yīng)的位置坐標(biāo),將屏幕指針定位到 相應(yīng)的位置。
3.如權(quán)利要求1或2所述的方法,其特征在于,在所述步驟B中,采用如下方式在所述文本坐標(biāo)映射表中查找與屏幕指針的當(dāng)前位 置最接近的界面元素的文本根據(jù)屏幕指針的移動方向,在所述文本坐標(biāo)映射表中查找該移動方向上與屏幕指針 的當(dāng)前位置最接近的界面元素的文本。
4.如權(quán)利要求3所述的方法,其特征在于,在所述步驟B中,采用如下方式實現(xiàn)根據(jù)屏幕指針的移動方向,在所述文本坐標(biāo)映 射表中查找該移動方向上與屏幕指針的當(dāng)前位置最接近的界面元素的文本當(dāng)屏幕指針的移動方向為向上時,如果屏幕指針當(dāng)前位置所屬的列的上方有文本, 則獲取位于該列的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向左或向右移動 一列或多列并在對應(yīng)列向上查找,直到查找到文本或屏幕指針達到所述目標(biāo)窗口的左邊 界或右邊界;當(dāng)屏幕指針的移動方向為向下時,如果屏幕指針當(dāng)前位置所屬的列的下方有文本, 則獲取位于該列的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向右或向左移動 一列或多列并在對應(yīng)列向下查找,直到查找到文本或屏幕指針達到所述目標(biāo)窗口的右邊 界或左邊界;當(dāng)屏幕指針的移動方向為向左時,如果屏幕指針當(dāng)前位置所屬的行的左方有文本, 則獲取位于該行的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向上或向下移動 一行或多行并在對應(yīng)行向左查找,直到查找到文本或屏幕指針達到所述目標(biāo)窗口的上邊 界或下邊界;當(dāng)屏幕指針的移動方向為向右時,如果屏幕指針當(dāng)前位置所屬的行的右方有文本, 則獲取位于該行的與屏幕指針當(dāng)前位置最接近的文本;否則將屏幕指針向下或向上移動 一行或多行并在對應(yīng)行向右查找,直到查找到文本或屏幕指針達到目標(biāo)窗口的下邊界或 上邊界。
5.如權(quán)利要求1所述的方法,其特征在于,在所述步驟B中,用戶使用輸入設(shè)備移動屏幕指針之后、在所述文本坐標(biāo)映射表中 查找與屏幕指針的當(dāng)前位置最接近的界面元素的文本之前,還包括如下步驟Bi:判斷屏幕指針的當(dāng)前位置是否在所述目標(biāo)窗口內(nèi)部,如果不在,則將屏幕指針的當(dāng)前位置定位到所述目標(biāo)窗口的內(nèi)部。
6.如權(quán)利要求5所述的方法,其特征在于,在所述步驟Bl中,所述目標(biāo)窗口的內(nèi)部為所述目標(biāo)窗口的邊界。
7.如權(quán)利要求6所述的方法,其特征在于,在所述步驟Bl中,所述目標(biāo)窗口的邊界為所述目標(biāo)窗口的左上角。
8.如權(quán)利要求6所述的方法,其特征在于,在所述步驟Bl中,如果判定屏幕指針的當(dāng)前位置不在所述目標(biāo)窗口內(nèi)部,則采用如 下方式之一定位屏幕指針的當(dāng)前位置當(dāng)用戶向右移動屏幕指針時,將屏幕指針的初始位置定位到所述目標(biāo)窗口的左邊界;當(dāng)用戶向左移動屏幕指針時,將屏幕指針的初始位置定位到所述目標(biāo)窗口的右邊界;當(dāng)用戶向下移動屏幕指針時,將屏幕指針的初始位置定位到所述目標(biāo)窗口的上邊界;當(dāng)用戶向上移動屏幕指針時,將屏幕指針的初始位置定位到所述目標(biāo)窗口的下邊界。
9.如權(quán)利要求1所述的方法,其特征在于, 在所述步驟A之后,還包括如下步驟當(dāng)接收到前景變換消息時,清空所述文本坐標(biāo)映射表中的內(nèi)容,將當(dāng)前活動窗口作 為新的目標(biāo)窗口,生成該新的目標(biāo)窗口的文本坐標(biāo)映射表。
10.如權(quán)利要求1所述的方法,其特征在于, 在所述步驟A之后,還包括如下步驟當(dāng)接收到所述目標(biāo)窗口的拖放開始消息時,清空所述文本坐標(biāo)映射表中的內(nèi)容; 當(dāng)接收到所述目標(biāo)窗口的拖放完成消息時,重新生成所述目標(biāo)窗口的文本坐標(biāo)映射表。
11.如權(quán)利要求1所述的方法,其特征在于, 在所述步驟A之后,還包括如下步驟以預(yù)先設(shè)定的時間間隔重復(fù)執(zhí)行如下操作清空所述文本坐標(biāo)映射表中的內(nèi)容,重 新生成所述目標(biāo)窗口的文本坐標(biāo)映射表、或?qū)?dāng)前活動窗口作為新的目標(biāo)窗口,生成該 新的目標(biāo)窗口的文本坐標(biāo)映射表。
全文摘要
一種軟件界面文本信息的輔助瀏覽方法,該方法包括如下步驟A生成目標(biāo)窗口的文本坐標(biāo)映射表;所述文本坐標(biāo)映射表中包含所述目標(biāo)窗口上顯示的文本及相應(yīng)的位置坐標(biāo);B用戶使用輸入設(shè)備移動屏幕指針后,在所述文本坐標(biāo)映射表中查找與屏幕指針的當(dāng)前位置最接近的界面元素的文本;C播放查找到的文本的內(nèi)容。本發(fā)明的方法通過獲取軟件界面上顯示的文本及相應(yīng)的位置坐標(biāo)來生成文本坐標(biāo)映射表,并使用文本坐標(biāo)映射表查找與當(dāng)前屏幕指針位置最接近的界面元素的文本,進而實現(xiàn)輔助用戶瀏覽軟件界面文本信息的功能。該方法可以讓用戶快捷地在軟件界面上的各文本信息間進行跳轉(zhuǎn)、瀏覽。
文檔編號G06F3/048GK102023805SQ201010593499
公開日2011年4月20日 申請日期2010年12月16日 優(yōu)先權(quán)日2010年12月16日
發(fā)明者何躍明, 張楠, 徐青松, 王衛(wèi)岳, 陸一峰, 陳天洲 申請人:杭州華馳科技有限公司, 浙江大學(xué)