專利名稱:獲取、處理和發(fā)送包含在一個圖形用戶界面窗口中的數(shù)據(jù)的裝置和方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及在圖形用戶接口(GUI)操作系統(tǒng)(OS)環(huán)境中的數(shù)據(jù)管理領(lǐng)域,尤其涉及從GUI窗口將文本和位圖捕獲到緩沖區(qū)、在GUI窗口中標(biāo)記文本和從緩沖區(qū)將數(shù)據(jù)發(fā)送到輸入/輸出設(shè)備或其它應(yīng)用程序或?qū)嵱霉ぞ咭员氵M(jìn)一步處理。
如今大多數(shù)的計算機(jī)系統(tǒng)用戶都在使用運(yùn)行有某種GUI操作系統(tǒng)的計算機(jī),比如微軟公司(Microsoft Corp.,Redmond,Washington)開發(fā)的Windows 3.1、Windows 3.11、Windows 95和IBM公司(IBM Corp.,Armonk,New-York)開發(fā)的IBM OS/2。這些操作系統(tǒng)能夠同時執(zhí)行很多應(yīng)用程序,包括線程(也就是多任務(wù))。這些應(yīng)用程序執(zhí)行例如字處理、數(shù)據(jù)庫管理和電子表格計算一類的任務(wù)。
以上提到的面向GUI的操作系統(tǒng)都是基于窗口這一概念的。窗口是GUI的基本單元,用戶是通過一個或多個窗口與應(yīng)用程序進(jìn)行交互的。文本和圖片(也就是位圖)是用戶與GUI交互時接觸的基本的信息單元。
在多任務(wù)操作系統(tǒng)中,應(yīng)用程序可以交換數(shù)據(jù)和相互控制。在多數(shù)現(xiàn)代操作系統(tǒng)中有多種進(jìn)程間通訊和數(shù)據(jù)交換機(jī)制,包括共享存儲器、剪貼板、應(yīng)用程序間通訊機(jī)制以及數(shù)據(jù)對象鏈接和嵌入服務(wù)。這些方式共有一個主要的缺點(diǎn)應(yīng)用程序必須設(shè)計并編碼為明確地支持這些進(jìn)程間通訊機(jī)制。
這些GUI操作系統(tǒng)中的多數(shù)如今都具有某種形式的臨時緩沖設(shè)施,從而某一窗口的數(shù)據(jù)可以剪切或復(fù)制到一個緩沖區(qū)(也就是Windows操作系統(tǒng)中的剪貼板)其后粘貼到其它應(yīng)用程序。使用這種緩沖區(qū)是從一個應(yīng)用程序獲取數(shù)據(jù)傳送到另一個應(yīng)用程序的一種簡便而高效的機(jī)制,尤其是應(yīng)用程序并非設(shè)計為相互協(xié)同工作時更是這樣。這種機(jī)制允許來自不同廠家的應(yīng)用程序不需要了解對方就可以進(jìn)行數(shù)據(jù)共享。但是,要使這種機(jī)制運(yùn)作,應(yīng)用程序必須編寫有用戶利用臨時緩沖區(qū)機(jī)制(也就是Windows操作系統(tǒng)中的剪貼板)所必需的剪切、復(fù)制和粘貼函數(shù)。令人遺憾的是,有很多應(yīng)用程序不具有這種從其窗口獲取數(shù)據(jù)并放入剪貼板的機(jī)制。應(yīng)用程序如終端仿真程序、數(shù)據(jù)通訊程序(即調(diào)制解調(diào)器和傳真程序)、Internet訪問軟件等通常不支持從其程序獲取數(shù)據(jù)并將其路由選擇到一個目的地的簡單方便的機(jī)制。
現(xiàn)有技術(shù)中為人們所熟知的屏幕捕獲程序,提供了一種可以替代剪貼板的捕獲窗口數(shù)據(jù)的方法,但是它們也有其缺點(diǎn)。屏幕捕獲程序在顯示存儲器級別操作。它們允許用戶捕獲實(shí)際可見屏幕上的任何部分而不理會顯示的數(shù)據(jù)的類型。捕獲的數(shù)據(jù)只能存儲為位像數(shù)據(jù)。如果不進(jìn)行附加的處理,例如光學(xué)字符識別(OCR),要截獲對應(yīng)于例如字處理一類軟件的屏幕上的文本部分并將捕獲數(shù)據(jù)存儲成文本或字串?dāng)?shù)據(jù)(例如ASCII格式)是不可能的。屏幕捕獲程序的缺陷就是不能將它們捕獲的數(shù)據(jù)按照數(shù)據(jù)的原始格式進(jìn)行存儲。
授予Chalas的美國專利第5,392,386號,教導(dǎo)了一種用于為運(yùn)行在具有剪貼板的GUI計算機(jī)系統(tǒng)中的現(xiàn)有應(yīng)用程序添加功能的系統(tǒng)。該系統(tǒng)監(jiān)聽OS和應(yīng)用程序之間的通訊并判斷何時用戶在調(diào)用某個附加功能。此系統(tǒng)響應(yīng)用戶命令將捕獲的信息發(fā)送到剪貼板。
因此我們期望擁有一種用于可以不使用剪貼板就從任何運(yùn)行在系統(tǒng)中的應(yīng)用程序獲取文本或位圖數(shù)據(jù)、存儲在緩沖區(qū)并發(fā)送到任何其它應(yīng)用程序或輸出設(shè)備的系統(tǒng)和方法。
以下,術(shù)語“輸出設(shè)備”將定義為硬件設(shè)備、文件、軟件應(yīng)用程序或其它存在于硬件或軟件中的任何能夠接受數(shù)據(jù)的插孔。術(shù)語“標(biāo)準(zhǔn)圖形格式”定義為Windows操作系統(tǒng)支持的任何圖形格式。術(shù)語“標(biāo)準(zhǔn)文本格式”定義為如今廣泛用于個人計算機(jī)的ASCII格式。
因此,本發(fā)明的一個目的就是提供一種能從屬于任意一個應(yīng)用程序的任何實(shí)際的窗口中按照其本來格式(即ASCII格式)捕獲文本并將文本存儲在一個緩沖區(qū)(非剪貼板)中以備稍后使用的系統(tǒng)和方法,由此此任意的應(yīng)用程序不需要支持應(yīng)用程序間通訊機(jī)制、數(shù)據(jù)對象鏈接和嵌入服務(wù)或剪貼板操作如剪切、復(fù)制和粘貼等。
本發(fā)明的另一個目的是提供一種能從屬于任意一個應(yīng)用程序的任何實(shí)際的窗口中按照其本來格式捕獲位像并將位像存儲在一個緩沖區(qū)(非剪貼板)中以備稍后使用的系統(tǒng)和方法,由此此任意的應(yīng)用程序不需要支持應(yīng)用程序間通訊機(jī)制、數(shù)據(jù)對象鏈接和嵌入服務(wù)或剪貼板操作如剪切、復(fù)制和粘貼等。
本發(fā)明的另一個目的是提供一種用于在從屬于任意一個應(yīng)用程序的任何實(shí)際的窗口上使用一個緩沖區(qū)中已存在的文本標(biāo)記文本的系統(tǒng)和方法。
本發(fā)明的另一個目的是提供一種用于將先前存儲在一個緩沖區(qū)中的文本和位圖傳送到用戶選定的其它應(yīng)用程序或輸出設(shè)備的系統(tǒng)。
按照本發(fā)明的一個推薦實(shí)施例,還提供了一種在一個計算機(jī)系統(tǒng)中獲取、處理和發(fā)送包含在用戶選擇的窗口的文本和/或位圖數(shù)據(jù)的方法,此方法包括步驟從一個窗口以原始文本和位圖格式獲取數(shù)據(jù)、將獲取的數(shù)據(jù)存儲在一個數(shù)據(jù)緩沖區(qū)中、處理存儲在此數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)以便指定其中一部分、將指定的數(shù)據(jù)發(fā)送到用戶選擇的至少一個輸出設(shè)備。
此外,獲取步驟包括步驟將應(yīng)用程序EXE模塊和關(guān)聯(lián)的動態(tài)鏈接庫(DLL)加載到內(nèi)存、確定用戶選擇的窗口的一個窗口句柄、使用窗口子類化(windows subclassing)、在用戶選擇的GUI窗口關(guān)聯(lián)的一個窗口過程上安裝至少一個鉤(hook)、在至少一個操作系統(tǒng)原始API函數(shù)上安裝至少一個應(yīng)用程序編程接口(API)鉤、強(qiáng)制用戶選擇的GUI窗口重繪以使選擇的窗口中所有文本和/或位圖數(shù)據(jù)被發(fā)送到選擇的窗口、過濾數(shù)據(jù)和用發(fā)送到選擇的窗口的文本和/或位圖數(shù)據(jù)填充一個文本緩沖區(qū)。
填充一個文本緩沖區(qū)和過濾數(shù)據(jù)的步驟包括強(qiáng)制選擇的窗口重繪其內(nèi)容、從原始窗口過程獲取控制并傳遞給位于本發(fā)明的DLL中的子類化過程、初始化文本緩沖區(qū)為一個已知狀態(tài)、利用本發(fā)明的DLL來捕獲并過濾重繪向選擇的窗口的文本和/或位圖數(shù)據(jù)、將數(shù)據(jù)存儲在緩沖區(qū)中以及將控制返還給原始窗口過程。
捕獲步驟包括步驟臨時移去至少一個的API鉤、從API函數(shù)的參數(shù)中復(fù)制數(shù)據(jù)到一臨時緩沖區(qū)以待進(jìn)一步處理、調(diào)用至少一個原始操作系統(tǒng)API函數(shù)以便在選擇的窗口中繪出文本和/或位圖數(shù)據(jù)以及重新安裝至少一個API鉤。
處理數(shù)據(jù)的步驟包括在用戶選擇的GUI窗口中確定一個將使用一個指點(diǎn)設(shè)備提供的坐標(biāo)進(jìn)行標(biāo)記的區(qū)域、根據(jù)定義區(qū)域的坐標(biāo)在緩沖區(qū)中搜索數(shù)據(jù)、高亮顯示GUI窗口中對應(yīng)于GUI窗口中將被標(biāo)記的區(qū)域中的數(shù)據(jù)的數(shù)據(jù)。
另外,高亮步驟包括步驟在GUI窗口中使用能將高亮文本與普通文本相區(qū)分的背景色繪出相應(yīng)于GUI窗口中待標(biāo)記出的區(qū)域中的數(shù)據(jù)的文本和沿著位像周圍繪出一個矩形以便將標(biāo)記的位像和原始位像區(qū)分開來。
另外,按照本發(fā)明的一個推薦實(shí)施例提供了一種處理并發(fā)送用戶選擇的窗口中包含的文本數(shù)據(jù)的方法,此方法包括步驟在子類化過程中獲取選擇的窗口上的接連的光標(biāo)坐標(biāo)、在本發(fā)明的DLL中的數(shù)據(jù)緩沖區(qū)中確定位于這些坐標(biāo)之間的文本、在選擇的窗口上使用不同的背景色繪出這些文本和隨后將指定的文本發(fā)送到一個或多個輸出設(shè)備。
另外,按照本發(fā)明的一個推薦實(shí)施例提供了一種處理和發(fā)送用戶選擇的窗口中包含的位圖數(shù)據(jù)的方法,此方法包括步驟在一個子類化過程中獲取選擇的窗口上的光標(biāo)坐標(biāo)、在本發(fā)明的數(shù)據(jù)緩沖區(qū)中確定位圖坐標(biāo)、在選擇的窗口上在位圖邊界繪出一個矩形框和隨后將指定的位圖發(fā)送到一個或多個輸出設(shè)備。
此外,按照本發(fā)明的一個推薦實(shí)施例還提供了一種圖形用戶界面窗口數(shù)據(jù)處理系統(tǒng)。這個系統(tǒng)包括用于從圖形用戶界面窗口捕獲數(shù)據(jù)和將此數(shù)據(jù)存儲在一個數(shù)據(jù)緩沖區(qū)的獲取裝置、一個用于按照用戶發(fā)出的命令處理數(shù)據(jù)的一部分的處理器,這個部分對應(yīng)于用戶指定的圖形用戶界面窗口中的一個區(qū)域、以及一個用于將處理器處理過的數(shù)據(jù)傳送到用戶選擇的輸出設(shè)備的路由器。
此外,按照本發(fā)明的一個推薦實(shí)施例還提供了一個計算機(jī)系統(tǒng)中一種從用戶選擇的圖形用戶接口窗口中獲取數(shù)據(jù)的方法。計算機(jī)執(zhí)行步驟包括安裝圖形用戶界面應(yīng)用程序編程接口函數(shù)鉤用于重定向與用戶選擇的圖形用戶界面窗口相關(guān)聯(lián)的應(yīng)用程序發(fā)出的圖形用戶界面函數(shù)調(diào)用、使用戶選擇的圖形用戶界面窗口重繪以及在數(shù)據(jù)重繪向用戶選擇的圖形用戶界面窗口時截取數(shù)據(jù)。
此外,從一個圖形用戶界面窗口獲取數(shù)據(jù)的方法還包括步驟在與用戶選擇的GUI窗口關(guān)聯(lián)的一個窗口過程上創(chuàng)建至少一個鉤。
最后,按照本發(fā)明的一個推薦實(shí)施例提供了一種用于獲取、處理并發(fā)送用戶選擇的圖形用戶界面(GUI)窗口中包含的文本和/或位圖數(shù)據(jù)的系統(tǒng)。圖形用戶界面窗口運(yùn)行在一個操作系統(tǒng)下,這個系統(tǒng)包括用于從用戶選擇的GUI窗口獲取數(shù)據(jù)的裝置、一個用于存儲獲取的數(shù)據(jù)的數(shù)據(jù)緩沖區(qū)、一個用于根據(jù)從用戶接收到的命令處理數(shù)據(jù)的處理器和一個用于將處理的數(shù)據(jù)發(fā)送到用戶選擇的至少一個輸出設(shè)備的路由器。
本發(fā)明在此僅通過實(shí)例并結(jié)合附圖進(jìn)行描述,其中
圖1給出了一個按照本發(fā)明的一個推薦實(shí)施例構(gòu)造的應(yīng)用程序應(yīng)用于運(yùn)行在計算機(jī)系統(tǒng)的一個GUI窗口環(huán)境下的任意一個應(yīng)用程序時的實(shí)例窗口;圖2是一個計算機(jī)處理系統(tǒng)的高層框圖,本發(fā)明可以在其中使用;圖3是本發(fā)明的一個推薦實(shí)施例的高層框圖;圖4是一個例示駐留于內(nèi)存中的本發(fā)明、任意兩個應(yīng)用程序和一個GUI操作系統(tǒng)之間的通訊的高層框圖;圖5是一個例示從任意一個應(yīng)用程序GUI窗口中獲取數(shù)據(jù)并將數(shù)據(jù)存儲在一個緩沖區(qū)中的方法的高層流程圖;圖6是一個例示選擇要從中捕獲數(shù)據(jù)的窗口和獲取其句柄的方法的高層流程圖;圖7是一個例示在獲取數(shù)據(jù)過程中選擇的窗口的窗口過程中的消息路徑的高程流程圖;圖8是一個例示構(gòu)造用于保存從任意一個應(yīng)用程序GUI窗口選擇的數(shù)據(jù)的文本緩沖區(qū)的方法的高層流程圖;圖9是一個例示高亮先前在窗口中選擇的文本的方法的高層流程圖;和圖10例示了包含在任意一個應(yīng)用程序GUI窗口中的部分文本的文本標(biāo)記部分。
本發(fā)明已經(jīng)用一個Windows應(yīng)用程序?qū)崿F(xiàn),此后將其稱為ANY。應(yīng)用程序ANY由一個主EXE模塊和一些動態(tài)鏈接庫(DLL)模塊組成,這些動態(tài)鏈接庫模塊統(tǒng)稱為ANY DLL模塊。ANY應(yīng)用程序駐留在計算機(jī)的內(nèi)存中。
在此公開的本發(fā)明使得在窗口GUI環(huán)境中工作的計算機(jī)用戶有能力獲取并發(fā)送包含在屬于任意一個應(yīng)用程序的屏幕上可見的任意一個實(shí)際窗口中的數(shù)據(jù),不管數(shù)據(jù)原先是不是“只用于查看”的。典型的應(yīng)用程序中的一個本發(fā)明的實(shí)例如圖1所示,現(xiàn)在以此為參考。
一個典型的計算機(jī)系統(tǒng)包括計算機(jī)32、鼠標(biāo)150、鍵盤148和視頻顯示器或屏幕20。在本例中,計算機(jī)32運(yùn)行在GUI操作系統(tǒng)控制下,例如Windows 3.1、Windows for Workgroups 3.11或Windows 95。顯示器20上顯示的有代表一個實(shí)施本發(fā)明的應(yīng)用程序的一個窗口152和與任意一個應(yīng)用程序關(guān)聯(lián)的一個窗口34。窗口34對應(yīng)的應(yīng)用程序可以是任意的能夠在屏幕20上繪出此窗口的應(yīng)用程序。實(shí)施本發(fā)明的窗口152包含一個或多個圖標(biāo)156,代表不同的用戶可編程的命令配置。
任意實(shí)際的可見的窗口都能使其內(nèi)容被捕獲。文本(即字串)數(shù)據(jù)和位像數(shù)據(jù)都可以被捕獲。要捕獲窗口中的數(shù)據(jù),用戶需要從窗口152拖動其中一個圖標(biāo),例如圖標(biāo)157,然后放到被選擇進(jìn)行捕獲的窗口中,例如窗口34。文本數(shù)據(jù)和圖形對象都可以被用戶高亮指定。用戶可以決定將選擇的數(shù)據(jù)發(fā)送或輸出到一個或多個目的地,例如文件、另外一個窗口、圖形工具或電子郵件服務(wù)(e-mail)。
圖2顯示的是一個可以運(yùn)行本發(fā)明的計算機(jī)系統(tǒng)32的高層框圖。計算機(jī)系統(tǒng)32包括一個連接到總線13的計算機(jī)處理器12。連接到總線13的還有只讀存儲器(ROM)14、隨機(jī)存儲器(RAM)16、海量存儲子系統(tǒng)(硬盤)18、視頻顯示適配卡22和輸入/輸出(I/O)子系統(tǒng)30。計算機(jī)系統(tǒng)32在其核心具有核心計算機(jī)中央處理器12。ROM 14包含用于計算機(jī)處理器12的固件。此固件將保證計算機(jī)32進(jìn)行初始化和執(zhí)行系統(tǒng)檢測等。RAM 16為計算機(jī)系統(tǒng)32提供在其中執(zhí)行運(yùn)算和運(yùn)行應(yīng)用程序的可讀/寫存儲器。硬盤18為計算機(jī)32提供長期存儲能力,用于存儲系統(tǒng)和應(yīng)用程序相關(guān)數(shù)據(jù)。視頻顯示適配器22為計算機(jī)32提供在視頻顯示器20上顯示信息的能力。I/O子系統(tǒng)30提供一個計算機(jī)處理器和外部世界之間的接口。輸入設(shè)備24包括鍵盤和指點(diǎn)設(shè)備等連接到I/O子系統(tǒng)30上。指點(diǎn)設(shè)備包括鼠標(biāo)、軌跡球、圖形輸入板等等。串行口26允許計算機(jī)系統(tǒng)32與串行設(shè)備,如調(diào)制解調(diào)器進(jìn)行通訊。并行口28允許計算機(jī)系統(tǒng)32與并行設(shè)備,如打印機(jī)進(jìn)行通訊??偩€13將計算機(jī)系統(tǒng)32的內(nèi)部組件連接在一起,并提供一種組件間通訊的內(nèi)部手段。
圖3顯示了本發(fā)明的一個推薦實(shí)施例。本發(fā)明的系統(tǒng)和設(shè)備,統(tǒng)稱為10(即ANY應(yīng)用程序),包括與一個數(shù)據(jù)處理器38和一個數(shù)據(jù)緩沖區(qū)44相連接的一個獲取單元36。數(shù)據(jù)處理器38連接到一個路由器40和數(shù)據(jù)緩沖區(qū)44。路由器40也連接到數(shù)據(jù)緩沖區(qū)44。GUI窗口34的數(shù)據(jù)被獲取單元36捕獲并存儲在數(shù)據(jù)緩沖區(qū)44中。數(shù)據(jù)緩沖區(qū)44可以完全或部分地駐留在RAM 16或硬盤18中。數(shù)據(jù)處理器38的作用是處理存儲在數(shù)據(jù)緩沖區(qū)44中的數(shù)據(jù)。路由器40將處理過的數(shù)據(jù)38發(fā)送到一個或多個輸出設(shè)備46。
圖4顯示了一個例示內(nèi)存中本發(fā)明、任意兩個應(yīng)用程序和一GUI操作系統(tǒng)之間的通訊的高層框圖。概念性地例示了進(jìn)行通訊的基本組件,包括應(yīng)用程序,應(yīng)用程序包括本發(fā)明和操作系統(tǒng)。在一個推薦實(shí)施例中,操作系統(tǒng)204是Windows 3.1、Windows 3.11或Microsoft Windows 95。圖4中例示的內(nèi)存布局包括數(shù)據(jù)結(jié)構(gòu)和程序或進(jìn)程,用矩形框表示。連接各個框的直線表示信息在進(jìn)程或數(shù)據(jù)結(jié)構(gòu)之間傳遞。
需要注意的是圖4僅僅是一個用于顯示數(shù)據(jù)流程和應(yīng)用程序與操作系統(tǒng)在內(nèi)存中的通訊的概念上的例示。操作系統(tǒng)中被認(rèn)為對于當(dāng)前討論不是至關(guān)重要的那些部分都沒有描述和討論。另外一個需要注意的地方是,在應(yīng)用程序執(zhí)行的過程中,內(nèi)存的利用是始終變化的。數(shù)據(jù)結(jié)構(gòu)和應(yīng)用程序代碼經(jīng)常被加載到或卸載出內(nèi)存。另外,在同一時間內(nèi)存中可以駐留有很多的不同進(jìn)程和數(shù)據(jù)結(jié)構(gòu)。
操作系統(tǒng)的模塊可以導(dǎo)出應(yīng)用程序編程接口(API)函數(shù)(例如在Windows 3.1/3.11中的KERNEL.EXE、USER.EXE和GDI.EXE)。應(yīng)用程序200和202是進(jìn)行字處理、數(shù)據(jù)庫管理或其它特定任務(wù)的進(jìn)程。這些應(yīng)用程序通過調(diào)用API函數(shù)與操作系統(tǒng)進(jìn)行交互。GUI窗口中的文本和位圖的繪畫和外觀是由應(yīng)用程序通過調(diào)用下述操作系統(tǒng)GUI API來控制的。
這些函數(shù)包括用于文本的
用于文本TextOut 在指定位置寫一個字符串TabbedTextOut寫一個標(biāo)記化字符串ExtTextOut 在一個矩形區(qū)域中寫一個字符串用于位圖BitBlt 從指定設(shè)備上下文中復(fù)制一個位圖到一個設(shè)備上下文StretchBlt 復(fù)制一個位圖,如果需要,擴(kuò)展或壓縮此位圖SetDIBits設(shè)置一個位圖的位為設(shè)備無關(guān)位圖(DIB)格式中指定的值SetDIBitsToDevice從一個DIB中的將位直接設(shè)置到一個設(shè)備的表面應(yīng)用程序ANY 206被適當(dāng)?shù)貥?gòu)造以實(shí)現(xiàn)系統(tǒng)10。應(yīng)用程序ANY 206的EXE模塊將其動態(tài)鏈接庫(DLL)ANY DLL 212加載到內(nèi)存。
為捕獲一個GUI窗口中的數(shù)據(jù),本發(fā)明利用了在本發(fā)明中被作為參考文件的Finnegan J.的“Hook and Monitor Any 16-bit Windows Functionwith Our ProcHook DLL”中描述的函數(shù)截取(function interception)技術(shù),這種技術(shù)允許任何導(dǎo)出的函數(shù)調(diào)用可以被鉤,如果需要可以多次。這種函數(shù)鉤(function hooking)技術(shù)將一個API函數(shù)調(diào)用替換為ANY DLL212中提供的一個回叫函數(shù),并且提供在此之后從回叫函數(shù)中調(diào)用原始函數(shù)的可能性,從而有效地鏈接此API調(diào)用。這樣API調(diào)用的截取提供了捕獲計算機(jī)系統(tǒng)中運(yùn)行的任意應(yīng)用程序的輸出到屏幕上窗口的文本和位圖的主要機(jī)制。
在一個推薦實(shí)施例中,鉤和捕獲機(jī)制是在與應(yīng)用程序200、202交互操作的應(yīng)用程序ANY206中實(shí)現(xiàn)的。應(yīng)用程序ANY加載其關(guān)聯(lián)的DLL,ANY DLL 212。ANY DLL由一個鉤安裝與卸載部件208和一個用于接收API調(diào)用并調(diào)用原始API的回叫函數(shù)的部件210所組成。ANY應(yīng)用程序206使用鉤安裝與卸載部件208來在先前提到的API函數(shù)上安裝截取鉤。當(dāng)應(yīng)用程序200或202調(diào)用API函數(shù)來在屏幕上它們的一個窗口上畫文本和/或位圖時,控制就被傳遞到ANY DLL中的一個回叫函數(shù)210。此回叫函數(shù)接收作為API函數(shù)參數(shù)的要被繪到屏幕上的全部數(shù)據(jù)?;亟泻瘮?shù)過濾后,參數(shù)數(shù)據(jù)被存儲在一個內(nèi)部緩沖區(qū)中。然后截取鉤208被移去,在回叫函數(shù)210中調(diào)用原始API函數(shù)以便實(shí)際地在屏幕上畫出這些數(shù)據(jù)。
圖5顯示了一個例示從一個任意應(yīng)用程序GUI窗口中捕獲數(shù)據(jù)并將其存儲在一個緩沖區(qū)中的方法的高層流程圖。圖5顯示的僅僅是需要的主要步驟,沒有給出的是那些涉及資源初始化和取消初始化的步驟,這些對于熟練的技術(shù)人員來說是十分熟悉的。應(yīng)用程序ANY是由工作在Windows環(huán)境中的用戶通過在程序管理器中點(diǎn)擊適當(dāng)?shù)膱D標(biāo)或從命令行來加載和激活的(步驟220)。然后用戶選擇一個包含要進(jìn)行捕獲的文本和/或位圖的窗口(步驟222)。
圖6顯示了例示一個推薦的選擇進(jìn)行數(shù)據(jù)捕獲的窗口和獲取其句柄的方法的高層流程圖。首先通過點(diǎn)擊一個與ANY應(yīng)用程序關(guān)聯(lián)的圖標(biāo)并將其拖放到其數(shù)據(jù)將被捕獲或獲取的目標(biāo)窗口上,將ANY應(yīng)用程序初始化(步驟240)。將圖標(biāo)放到目標(biāo)窗口上的過程將使得ANY應(yīng)用程序能獲取此窗口的句柄。用戶在ANY應(yīng)用程序的圖標(biāo)上點(diǎn)擊后,將對API函數(shù)SetCapture進(jìn)行調(diào)用,此函數(shù)將把所有的鼠標(biāo)或光標(biāo)輸入重定向到ANY應(yīng)用程序的內(nèi)部窗口(步驟242)。鼠標(biāo)然后被拖到目標(biāo)窗口(步驟244)。當(dāng)鼠標(biāo)或光標(biāo)在目標(biāo)窗口中,點(diǎn)擊發(fā)生后屏幕上光標(biāo)的坐標(biāo)就被確定了(步驟248)。使用API函數(shù)WindowFromPoint,獲得包含指定鼠標(biāo)點(diǎn)光標(biāo)窗口的句柄(步驟250)。
再來看圖5,應(yīng)用程序窗口的所有繪制都是由發(fā)向此窗口的過程的消息來觸發(fā)的。為檢測向一個窗口的過程的消息傳送,需要對選擇的窗口的過程進(jìn)行子類化(subclass)(步驟224)。子類化還能讓ANY應(yīng)用程序知道什么時候應(yīng)用程序的窗口過程將控制返還給操作系統(tǒng)。子類化在Petzold C.的在本發(fā)明中作為對比文件的“Programming Windows 3.1”中有進(jìn)一步詳盡描述。一旦應(yīng)用程序的窗口被子類化,位于ANY DLL中的一個子類過程(回叫函數(shù))將接收所有原來預(yù)定發(fā)向選擇的窗口的窗口過程的消息。其中某些消息可以由ANY應(yīng)用程序控制。
然后便開始截取(interception)來截取文本和位圖函數(shù),使用的是先前描述過的函數(shù)鉤技術(shù)(步驟226)。API函數(shù)截取允許應(yīng)用程序ANY接收從任意應(yīng)用程序包括Windows本身定向到屏幕的所有輸出。應(yīng)用程序ANY然后強(qiáng)制與選擇的窗口關(guān)聯(lián)的應(yīng)用程序重繪其窗口(步驟228)。在執(zhí)行步驟228中,使用了API函數(shù)Redraw Windows,它將導(dǎo)致窗口消息WM_PAINT被發(fā)送到與選擇的窗口關(guān)聯(lián)的應(yīng)用程序。窗口的消息WM_PAINT將強(qiáng)制應(yīng)用程序重繪其窗口。隨著窗口的重繪,便形成了文本緩沖(步驟230)。
現(xiàn)在將描述用于子類化和函數(shù)截取的控制路徑(control path)。參見圖7,一個窗口消息例如WM_PAINT進(jìn)入位于ANY DLL中的子類化回叫函數(shù)(步驟252)。然后ANY應(yīng)用程序初始化其內(nèi)部緩沖區(qū)并且此消息被傳遞到原始窗口過程,使用API函數(shù)CallWindowProc(步驟254)。然后窗口過程處理此消息(步驟256)。當(dāng)遇到消息WM_PAINT時,應(yīng)用程序200或202將調(diào)用API函數(shù)以便繪出文本和位圖。這些調(diào)用將被截取并重定向到ANY DLL的回叫函數(shù)。在ANY DLL中,過濾作為參數(shù)傳遞向API函數(shù)的繪制數(shù)據(jù)將并將其存儲在ANY應(yīng)用程序的一個內(nèi)部緩沖區(qū)中。然后控制返還給ANY DLL的子類化過程(步驟258)。這將作為對ANY應(yīng)用程序的一個通知,即消息的處理已經(jīng)完成。控制然后返還給操作系統(tǒng)(步驟259)。
圖8顯示的是一個例示構(gòu)造用于保存從任意一個應(yīng)用程序GUI窗口捕獲的數(shù)據(jù)的緩沖區(qū)的方法的高層流程圖。前面已經(jīng)描述了,應(yīng)用程序200和202是由消息WM_PAINT來強(qiáng)制重繪其窗口的。在子類化過程中,此消息將使得緩沖區(qū)被初始化(步驟260)。此消息接下來被傳送到應(yīng)用程序200和202的原始窗口過程。為重繪其窗口,應(yīng)用程序?qū)⒄{(diào)用一個或多個被ANY應(yīng)用程序截取的API函數(shù),(步驟262)。對于文本字串?dāng)?shù)據(jù),字串本身和字串的起始位置坐標(biāo)是API函數(shù)的主要參數(shù)。其它文本屬性,比如字體、映射模式、背景色、文本色等從始終作為一個參數(shù)而包含的設(shè)備上下文(DC)結(jié)構(gòu)句柄獲得。為了確定字串中所有字符的坐標(biāo),通過API函數(shù)SelectObject和GetMapMode來確定字體和映射模式。隨后,字串中所有字符的橫縱坐標(biāo)就可以通過API函數(shù)GetTextExtent來確定。這樣,與此字串在應(yīng)用程序窗口中顯示的相同的一個精確的表示就存放在ANY應(yīng)用程序的內(nèi)部緩沖區(qū)中了(步驟264)。
在一個推薦實(shí)施例中,僅僅獲取位圖的頂角坐標(biāo)。當(dāng)圍繞位圖的矩形的坐標(biāo)確定后,組成位圖的所有位都從屏幕上復(fù)制下來。從屏幕復(fù)制位圖的方法在作為本發(fā)明的對比文件的Microsoft Software Development Kit中有描述。
重繪不僅僅發(fā)生在選擇的窗口的客戶矩形區(qū),也發(fā)生在屏幕的其它部分。ANY應(yīng)用程序截獲所有對API函數(shù)的調(diào)用從而強(qiáng)制過濾傳入的數(shù)據(jù)。僅在選擇的先前確定句柄的窗口中繪出的數(shù)據(jù)才必須存儲在緩沖區(qū)中。在一個推薦實(shí)施例中,只有可以從中獲取窗口句柄的API函數(shù)的參數(shù)是設(shè)備上下文。設(shè)備上下文是應(yīng)用程序窗口和屏幕繪制設(shè)備(即設(shè)備驅(qū)動器)之間的聯(lián)系環(huán)節(jié)。為從設(shè)備上下文中確定窗口句柄,必須考慮到幾何問題。API函數(shù)GetDCOrg被用來獲取窗口客戶區(qū)左上角坐標(biāo)。為了取得一個輸出重定向到其上的窗口的句柄,要使用API函數(shù)WindowFromPoint,它提供繪制發(fā)生于其上的窗口的句柄。選擇的窗口的句柄和輸出重定向到的窗口的句柄的比較使得ANY應(yīng)用程序可以將來自于選擇的窗口的繪制數(shù)據(jù)存放在其緩沖區(qū)中。然后控制被返還給子類化過程,這樣便給ANY應(yīng)用程序發(fā)送繪制已經(jīng)完成的信號(步驟266)??刂迫缓蟊环颠€給操作系統(tǒng)(步驟268)。
本發(fā)明的數(shù)據(jù)處理包含從ANY應(yīng)用程序的緩沖區(qū)中選擇文本和位圖的一部分。接下來,被標(biāo)記或被選擇的數(shù)據(jù)被發(fā)送到一個或多個輸出設(shè)備。為了指定數(shù)據(jù)以便其它應(yīng)用,數(shù)據(jù)在選擇的窗口中被標(biāo)志出來。
為了在選擇的窗口中標(biāo)志文本,位于一組固定坐標(biāo)之間的文本必須用不同的背景色畫出以便用戶可以將標(biāo)志文本和未標(biāo)志文本區(qū)分開來。在一個推薦實(shí)施例中,直線和塊標(biāo)志模式以及使用鼠標(biāo)或光標(biāo)雙擊的詞標(biāo)志被用來實(shí)現(xiàn)此文本高亮機(jī)制。
圖9顯示的是一個例示在先前選擇的GUI窗口中標(biāo)志或高亮顯示文本的方法的高層流程圖。被選擇的窗口已經(jīng)被子類化,并且光標(biāo)或鼠標(biāo)消息是在子類化過程中處理的,不允許進(jìn)入原始窗口過程。這樣它們將不控制應(yīng)用程序200和202的動作。用戶標(biāo)志的區(qū)域通過鼠標(biāo)或光標(biāo)坐標(biāo)來確定(步驟276)。對于文本,用用戶選擇的坐標(biāo)來定義的區(qū)域中的字串出現(xiàn)在ANY應(yīng)用程序的內(nèi)部緩沖區(qū)中(步驟278)。API函數(shù)上的截取鉤被臨時移去以免再次捕獲字串,造成不確定情況。然后字串用API函數(shù)ExtTextOut在選擇的窗口中用不同的背景色進(jìn)行重繪。背景色是通過API函數(shù)SetBkColor來設(shè)置的,使得文本在屏幕上看起來被標(biāo)志出來。位圖是通過在其周邊使用位圖的坐標(biāo)繪出一個矩形來標(biāo)志的(步驟280)。然后截取鉤被重新建立。標(biāo)志區(qū)域中的文本被發(fā)送到一個或多個輸出設(shè)備以便進(jìn)行進(jìn)一步處理。
圖10例示了包含在任意應(yīng)用程序GUI窗口中的一部分文本的文本標(biāo)志。在本例中,給出了程序管理器中對應(yīng)于菜單項“文件/新”的對話框(在Windows 3.1和3.11中)(282)。對話框包含三個按鈕,分別是“有效”、“取消”(284)和“幫助”。這些按鈕本質(zhì)上也是窗口,通常不支持?jǐn)?shù)據(jù)傳輸。但是使用本發(fā)明,“取消”按鈕中通常不可訪問的文本此時可以被標(biāo)記并可根據(jù)用戶的命令發(fā)送到多種輸出設(shè)備。例如,被標(biāo)記的文本(286)可以被發(fā)送到另外一個應(yīng)用程序,比如一個圖形工具、字處理器、數(shù)據(jù)庫管理系統(tǒng)等等。
以上已經(jīng)結(jié)合一些實(shí)施例對本發(fā)明進(jìn)行了描述,應(yīng)該看到本發(fā)明還可以有許多的變形、修改其它應(yīng)用。
權(quán)利要求
1.一種計算機(jī)系統(tǒng)中獲取、處理和發(fā)送包含在用戶選擇的一個圖形用戶界面(GUI)窗口中的文本和/或位圖數(shù)據(jù)的方法,所述圖形用戶界面窗口運(yùn)行在一個操作系統(tǒng)下,此方法包括以下計算機(jī)可實(shí)現(xiàn)步驟a.從所述用戶選擇的所述GUI窗口獲取所述數(shù)據(jù);b.將所述獲取的數(shù)據(jù)存儲在一個數(shù)據(jù)緩沖區(qū)中;c.按照從所述用戶接收到的命令處理所述數(shù)據(jù);和d.將所述處理過的數(shù)據(jù)發(fā)送到用戶選擇的至少一個輸出設(shè)備。
2.根據(jù)權(quán)利要求1的方法,其中所述獲取步驟包括以下步驟a.將系統(tǒng)應(yīng)用程序代碼和關(guān)聯(lián)的動態(tài)鏈接庫(DLL)加載到所述操作系統(tǒng)的一個內(nèi)存區(qū)域;b.確定所述用戶選擇的所述窗口的一個窗口句柄;c.在與所述用戶選擇的所述GUI窗口關(guān)聯(lián)的一個窗口過程上安裝至少一個鉤;d.在所述操作系統(tǒng)的至少一個原始API函數(shù)上安裝至少一個應(yīng)用程序編程接口(API)鉤;e.強(qiáng)制重繪所述用戶選擇的所述GUI窗口,從而使所述選擇的窗口中的所有文本和/或位圖數(shù)據(jù)被發(fā)送給所述選擇的窗口;和f.用發(fā)送給所述選擇的窗口的所述文本和/或位圖數(shù)據(jù)填充一個文本緩沖區(qū)。
3.根據(jù)權(quán)利要求2的方法,其中所述填充一個文本緩沖區(qū)的步驟包括a.強(qiáng)制所述選擇的窗口重繪其內(nèi)容;b.將所述文本緩沖區(qū)初始化為一已知狀態(tài);c.利用所述DLL來捕獲重繪向所述選擇的窗口的文本和/或位圖數(shù)據(jù)并將其存儲在所述緩沖區(qū)中;d.將控制返還給所述子類化窗口過程;和e.將控制返還給所述操作系統(tǒng)。
4.根據(jù)權(quán)利要求3的方法,其中所述利用所述DLL來捕獲文本和/或位圖數(shù)據(jù)的步驟包括a.臨時地移去所述至少一個API鉤;b.復(fù)制所述API函數(shù)參數(shù)中包含的數(shù)據(jù)到一臨時緩沖區(qū);c.調(diào)用所述至少一個原始操作系統(tǒng)API函數(shù)以便在所述選擇的窗口上繪出所述文本和/或位圖數(shù)據(jù);和d.重新安裝所述至少一個API鉤。
5.根據(jù)權(quán)利要求1的方法,其中所述處理步驟包括步驟a.確定利用一種指點(diǎn)設(shè)備提供的坐標(biāo)標(biāo)志的所述用戶選擇的所述GUI窗口的一個區(qū)域;b.在所述緩沖區(qū)中按照定義所述區(qū)域的所述坐標(biāo)搜索數(shù)據(jù);和c.高亮顯示所述GUI窗口中對應(yīng)所述GUI窗口中要進(jìn)行標(biāo)志的所述區(qū)域中所述數(shù)據(jù)的數(shù)據(jù)。
6.根據(jù)權(quán)利要求5的方法,其中所述高亮步驟包括步驟a.在所述GUI窗口中使用一種能將標(biāo)志文本同原始文本區(qū)分開來的背景色繪出對應(yīng)于所述GUI窗口中所述區(qū)域中要進(jìn)行標(biāo)志的所述數(shù)據(jù)的文本;和b.在所述位像的周圍繪出一個矩形,以便將標(biāo)志位像同原始位像區(qū)分開來。
7.一種圖形用戶界面窗口數(shù)據(jù)處理系統(tǒng),包括a.用于從一個圖形用戶界面窗口中捕獲數(shù)據(jù)的獲取裝置,所述獲取裝置將所述數(shù)據(jù)存儲在一個數(shù)據(jù)緩沖區(qū)中;b.一個用于按照用戶發(fā)出的命令處理部分所述數(shù)據(jù)的處理器,所述部分對應(yīng)于圖形用戶界面窗口上用戶指定的一個區(qū)域;和c.一個用于將所述處理器處理的所述數(shù)據(jù)傳輸?shù)接脩暨x擇的至少一個輸出設(shè)備的路由器。
8.計算機(jī)系統(tǒng)中從一個用戶選擇的一個圖形用戶界面窗口中獲取數(shù)據(jù)的方法,此計算機(jī)可實(shí)施步驟包括a.安裝圖形用戶界面應(yīng)用程序編程接口函數(shù)鉤,以重定向來自于與用戶選擇的圖形用戶界面窗口關(guān)聯(lián)的一個應(yīng)用程序的圖形用戶界面函數(shù)調(diào)用;b.使得用戶選擇的圖形用戶界面窗口重繪;和c.當(dāng)所述數(shù)據(jù)重繪向用戶選擇的圖形用戶界面窗口時截取所述數(shù)據(jù)。
9.權(quán)利要求8的方法,還包括在一個與所述用戶選擇的GUI窗口關(guān)聯(lián)的窗口過程上創(chuàng)建至少一個鉤的步驟。
10.一種用于獲取、處理和發(fā)送包含在一個用戶選擇的圖形用戶界面(GUI)窗口中的文本和/或位圖數(shù)據(jù)的系統(tǒng),所述圖形用戶界面窗口運(yùn)行在一個操作系統(tǒng)下,所述系統(tǒng)包括a.用于從所述用戶選擇的所述GUI窗口獲取所述數(shù)據(jù)的裝置;b.一個用于存儲所述獲取的數(shù)據(jù)的數(shù)據(jù)緩沖區(qū);c.一個用于按照從所述用戶接收到的命令處理所述數(shù)據(jù)的處理器;和d.一個用于將所述處理過的數(shù)據(jù)發(fā)送向所述用戶選擇的至少一個輸出設(shè)備的路由器;
11.根據(jù)權(quán)利要求10的系統(tǒng),其中所述用于獲取的裝置包括a.用于將系統(tǒng)應(yīng)用程序代碼和相關(guān)聯(lián)的動態(tài)鏈接庫(DLL)加載到所述操作系統(tǒng)的一個內(nèi)存區(qū)域的裝置;b.用于確定所述用戶選擇的所述窗口的一個窗口句柄的裝置;c.用于在與所述用戶選擇的所述GUI窗口相關(guān)聯(lián)的一個窗口過程上安裝至少一個鉤的裝置;d.用于在所述操作系統(tǒng)的至少一個原始API函數(shù)上安裝至少一個應(yīng)用程序編程接口(API)鉤的裝置;e.用于強(qiáng)制所述用戶選擇的所述GUI窗口重繪,以便使所述選擇的窗口中的所有的文本和/或位圖數(shù)據(jù)被發(fā)送到所述選擇的窗口的裝置;和f.用于用所述發(fā)送向所述選擇的窗口的文本和/或位圖數(shù)據(jù)填充一個文本緩沖區(qū)的裝置。
12.根據(jù)權(quán)利要求11的系統(tǒng),其中所述用于填充一個文本緩沖區(qū)的裝置包括a.用于強(qiáng)制所述選擇的窗口重繪其內(nèi)容的裝置;b.用于將所述文本緩沖區(qū)初始化為一個已知狀態(tài)的裝置;c.一個用于捕獲重繪向所述選擇的窗口的文本和/或位圖數(shù)據(jù)并將其存儲在所述緩沖區(qū)中的DLL;d.用于將控制返還給所述子類化窗口過程的裝置;和e.用于將控制返還給所述操作系統(tǒng)的裝置。
13.根據(jù)權(quán)利要求12的系統(tǒng),其中所述DLL包括a.用于臨時移去所述至少一個API鉤的裝置;b.用于將所述API函數(shù)的參數(shù)中包含的數(shù)據(jù)復(fù)制到一個臨時緩沖區(qū)的裝置;c.用于調(diào)用所述至少一個原始操作系統(tǒng)API函數(shù)以便在所述選擇的窗口上繪出所述文本和/或位圖數(shù)據(jù)的裝置;和d.用于重新安裝所述至少一個API鉤的裝置。
14.根據(jù)權(quán)利要求10的系統(tǒng),其中所述處理器包括a.確定所述用戶選擇的利用一個指點(diǎn)設(shè)備提供的坐標(biāo)來標(biāo)志的所述GUI窗口上的一個區(qū)域的裝置;b.用于在所述緩沖區(qū)中根據(jù)所述定義所述區(qū)域的坐標(biāo)來搜索數(shù)據(jù)的;和c.用于高亮顯示所述GUI窗口中對應(yīng)于所述GUI窗口中所述區(qū)域中要被標(biāo)志的所述數(shù)據(jù)的數(shù)據(jù)的裝置。
15.根據(jù)權(quán)利要求14的系統(tǒng),其中所述用于高亮的裝置包括a.用于在所述GUI窗口中用一個能將標(biāo)志文本和原始文本區(qū)分開來的背景色繪出對應(yīng)于所述GUI窗口中所述區(qū)域中要被標(biāo)志的所述數(shù)據(jù)的文本的裝置;和b.用于在所述位像周圍繪出一個矩形,以便將標(biāo)志位像與原始位像區(qū)分開來的裝置。
全文摘要
本發(fā)明描述了一種獲取、處理和發(fā)送包含在一個圖形用戶界面窗口中的數(shù)據(jù)的裝置和方法。包含在用戶選擇的窗口(34)中的數(shù)據(jù)由一個采集單元(36)捕獲并存儲在一個數(shù)據(jù)緩沖區(qū)(44)中。此數(shù)據(jù),不管是字串?dāng)?shù)據(jù)還是位像數(shù)據(jù),以標(biāo)準(zhǔn)的圖形用戶界面文本和/或位圖格式存儲在數(shù)據(jù)緩沖區(qū)中。用戶可以標(biāo)記選擇的窗口中包含的文本或位像的一部分。經(jīng)過處理的數(shù)據(jù)接下來被發(fā)送到一個或多個輸出設(shè)備(46)。輸出設(shè)備可以包括如文件、打印機(jī)、窗口、電子郵件服務(wù)和操作系統(tǒng)臨時緩沖區(qū)。描述了在選擇的窗口中獲取和標(biāo)記數(shù)據(jù)的方法。
文檔編號G06F9/46GK1262748SQ97194784
公開日2000年8月9日 申請日期1997年4月2日 優(yōu)先權(quán)日1996年4月4日
發(fā)明者伊蘭·波雷, 阿納·阿爾格馬, 伊亞·西皮波格 申請人:安尼索福特公司