專利名稱:一種準確獲取計算機屏幕變化的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別是指一種準確獲取計算機屏幕變化的方法。
現(xiàn)有技術(shù)中獲取計算機屏幕變化的方法,需要將顯示存儲器中的前一幀圖像數(shù)據(jù)存儲起來,再令當前幀圖像數(shù)據(jù)與前一幀圖像數(shù)據(jù)進行比較,從而獲得圖像變化值。這種方法的缺點在于無論屏幕是否變化,計算機都需要周期性地(例如每秒30次)抓取當前全部屏幕圖像,將之與上一周期存儲的圖像進行比較。因而將占用大量計算機資源。
為達到上述目的,本發(fā)明的技術(shù)方案是這樣實現(xiàn)的一種準確獲取計算機屏幕變化的方法,該方法至少包括以下步驟A、通過一個控制臺主模塊,在進程代碼執(zhí)行前完成一應(yīng)用程序編程接口(API)鉤子模塊的掛接,該API鉤子模塊攔截圖像輸出函數(shù),獲取其輸出區(qū)域,并通過消息發(fā)送給控制臺主模塊;所述的控制臺主模塊并且載入一消息鉤子模塊,為操作系統(tǒng)掛接消息鉤子,攔截用戶輸入事件以及引起屏幕變化的消息,并將該消息發(fā)送給控制臺主模塊;B、控制臺主模塊處理接收到的消息流,合并屏幕變化的區(qū)域,抓取該區(qū)域的圖像。
其中,步驟A所述的API鉤子模塊的掛接過程進一步包含控制臺主模塊將一個進程掛接模塊插入到操作系統(tǒng)進程空間,用于攔截進程創(chuàng)建函數(shù),在系統(tǒng)調(diào)用進程創(chuàng)建函數(shù)時,將API鉤子模塊插入到新創(chuàng)建的進程空間中。
其中,所述的API鉤子模塊插入到新創(chuàng)建的進程空間后,執(zhí)行以下步驟a、遍歷進程中運行的所有模塊并為每個模塊掛接API鉤子;b、監(jiān)視操作系統(tǒng)的模塊加載函數(shù)并為獲取過程地址函數(shù)(GetProcAddress)掛接API鉤子;c、將所攔截API引起的變化區(qū)域信息轉(zhuǎn)化為矩形坐標發(fā)送給控制臺主模塊。
其中,步驟B所述的控制臺主模塊是利用圖形驅(qū)動接口(GDI),或直接繪圖應(yīng)用程序接口(DirectDraw API)抓取屏幕變化區(qū)域的圖像。
其中,在步驟A中,所述的消息鉤子模塊攔截系統(tǒng)消息與用戶輸入事件后,進入一消息處理函數(shù),該消息處理函數(shù)判斷上述消息或事件是否能夠引起屏幕變化,如是則將變化區(qū)域信息轉(zhuǎn)化為矩形坐標,發(fā)送給控制臺主模塊。
本發(fā)明避免了現(xiàn)有技術(shù)中無論是否屏幕發(fā)生變化,都要周期性地抓取屏幕圖像的要求,通過消息鉤子和API鉤子收集屏幕的變化,確定屏幕變化區(qū)域,抓取屏幕變化區(qū)域的圖像,極大地提高了處理效率,節(jié)省了計算機資源。
由于本方法要求在進程代碼執(zhí)行前完成掛接,用API函數(shù)攔截圖形輸出函數(shù),并且用掛接消息鉤子攔截各種消息,因此,能對系統(tǒng)的全部運行過程進行監(jiān)測,從而準確獲取屏幕變化的數(shù)據(jù)。能夠可靠地應(yīng)用于遠程監(jiān)控,電子教室等領(lǐng)域。
本發(fā)明按照利用Windows的消息鉤子和API鉤子發(fā)現(xiàn)屏幕變化并獲得變化區(qū)域,繼而抓取變化區(qū)域圖像的思路進行設(shè)計。
鉤子(HOOK)機制是被Windows程序經(jīng)常使用的技術(shù)之一,程序員可以利用設(shè)置Windows鉤子擴展函數(shù)(SetWindowsHookEx)來攔截一些Windows消息和由此引發(fā)的事件;也可以利用替換程序中使用的應(yīng)用程序編程接口(API)的方法,對相關(guān)Windows API進行攔截。
當為某個Windows進程掛接Windows消息鉤子(Windows MessageHook)時,存放消息處理函數(shù)的動態(tài)鏈接庫(DLL)會被映射進該進程中,這樣就將一個DLL插入到另一個進程的地址空間中,從而進行攔截。這個方法的優(yōu)點是十分簡便,缺陷在于,進程僅在接受某種消息時,要插入的DLL才會被映射,在這之前,程序的運行不受控制,所以需要與API鉤子的應(yīng)用相結(jié)合。
本發(fā)明中,API鉤子模塊用于攔截圖像輸出函數(shù),獲取其輸出區(qū)域,并通過消息發(fā)送給控制臺主模塊。針對API鉤子模塊的掛接,需要控制臺主模塊將一個進程掛接模塊插入到操作系統(tǒng)進程空間,用于攔截進程創(chuàng)建函數(shù),在系統(tǒng)調(diào)用進程創(chuàng)建函數(shù)時,將API鉤子模塊插入到新創(chuàng)建的進程空間中。
API鉤子模塊插入到新創(chuàng)建的進程空間后,執(zhí)行以下步驟a、遍歷進程中運行的所有模塊并為每個模塊掛接API鉤子;b、監(jiān)視操作系統(tǒng)的模塊加載函數(shù),包括ASCII版本的LoadLibrary函數(shù)和Unicode版本的LoadLibraryEx函數(shù),同時為獲取過程地址函數(shù)(GetProcAddress)掛接API鉤子;c、將所攔截API引起的變化區(qū)域信息轉(zhuǎn)化為矩形坐標發(fā)送給控制臺主模塊。
通過消息鉤子模塊和在進程代碼執(zhí)行前掛接的API鉤子模塊,計算機可以準確地發(fā)現(xiàn)屏幕變化以及變化區(qū)域,從而實現(xiàn)準確抓取。
圖1為本發(fā)明的功能模塊示意圖。其主要的流程為為控制臺主模塊101掛接消息鉤子模塊102,同時,在控制臺主模塊101中插入進程掛接模塊103,在進程掛接模塊103插入新進程時,掛接API鉤子模塊104,將消息鉤子和API鉤子攔截到的屏幕變化發(fā)送給控制臺主模塊,由控制臺主模塊再進行處理。下面就每一模塊分別說明如下圖2為本發(fā)明的控制臺主模塊流程圖。啟動主模塊后,步驟201載入消息鉤子模塊,為系統(tǒng)掛接消息鉤子;步驟202利用遠程線程創(chuàng)建函數(shù)將進程掛接模塊插入系統(tǒng)進程中,在所有掛接完成后,執(zhí)行步驟203進入消息循環(huán)。
步驟203判斷當前消息隊列是否空閑,如果是執(zhí)行步驟204,抓取更新區(qū)屏幕圖像,返回步驟203,重新判斷;否則執(zhí)行步驟205。
步驟205判斷消息類型,如果是屏幕更新消息,執(zhí)行步驟206,進行相應(yīng)消息處理,執(zhí)行步驟207,將消息中的更新區(qū)與當前區(qū)域合,利用有關(guān)的圖形驅(qū)動接口(GDI)或直接繪圖應(yīng)用程序接口(DirectDraw API)抓取該區(qū)域的圖像,完成一次抓取過程,返回步驟203;如果是系統(tǒng)退出消息,執(zhí)行步驟208,卸載消息鉤子模塊;執(zhí)行步驟209,卸載進程掛接模塊,退出主模塊。
圖3為本發(fā)明的消息鉤子模塊流程圖。載入本模塊后,步驟301為操作系統(tǒng)設(shè)置消息鉤子;步驟302攔截系統(tǒng)消息與用戶輸入事件;步驟303進入消息處理函數(shù);步驟304判斷是否是引起屏幕變化的消息或事件,如果是執(zhí)行步驟305,消息處理函數(shù)通過重新映射實際屏幕的絕對坐標將其轉(zhuǎn)化為矩形坐標,并將轉(zhuǎn)化的更新區(qū)發(fā)送給控制臺主模塊;否則執(zhí)行步驟306,交給系統(tǒng)繼續(xù)執(zhí)行原操作。至此,所有引起屏幕變化的系統(tǒng)消息及用戶輸入事件均被攔截。
圖4為本發(fā)明的進程掛接模塊流程圖,系統(tǒng)進程加載該模塊后,執(zhí)行步驟401,用該模塊替換系統(tǒng)進程中的CreateProcessA和CreateProcessW進程創(chuàng)建函數(shù);步驟402創(chuàng)建新進程,并將其掛起;步驟403將API鉤子模塊插入到新創(chuàng)建進程的地址空間;步驟404恢復(fù)該進程的執(zhí)行。這樣所有新創(chuàng)建的進程都會被掛接API鉤子。
進程掛接API鉤子模塊后,就進入了API的鉤子程序,圖5即為本發(fā)明的API鉤子模塊流程圖。步驟501遍歷進程中運行的所有模塊,并為每個模塊掛接API鉤子;步驟502為了防止進程在運行中動態(tài)加載別的模塊,還必須監(jiān)視操作系統(tǒng)的模塊加載函數(shù),由于Unicode的問題,實際上要監(jiān)視ASCII版本的LoadLibrary函數(shù)和Unicode版本的LoadLibraryEx函數(shù);步驟503為GetProcAddress進行掛接;步驟504攔截引起屏幕變化的API函數(shù),并將變化轉(zhuǎn)換為矩形坐標發(fā)送給控制臺主模塊。至此,所有引起屏幕變化的圖像輸出函數(shù)均被攔截。
這樣,在進程代碼執(zhí)行前就完成了所有進程的掛接,同時對系統(tǒng)的全部運行過程進行監(jiān)測,從而可以準確獲取屏幕的變化的數(shù)據(jù)。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
1.一種準確獲取計算機屏幕變化的方法,其特征在于至少包含以下步驟A、通過一個控制臺主模塊,在進程代碼執(zhí)行前完成一API鉤子模塊的掛接,該API鉤子模塊攔截圖像輸出函數(shù),獲取其輸出區(qū)域,并通過消息發(fā)送給控制臺主模塊;所述的控制臺主模塊并且載入一消息鉤子模塊,為操作系統(tǒng)掛接消息鉤子,攔截用戶輸入事件以及引起屏幕變化的消息,并將該消息發(fā)送給控制臺主模塊;B、控制臺主模塊處理接收到的消息流,合并屏幕變化的區(qū)域,抓取該區(qū)域的圖像。
2.如權(quán)利要求1所述的準確獲取計算機屏幕變化的方法,其特征在于在步驟A中,API鉤子模塊的掛接過程進一步包含控制臺主模塊將一個進程掛接模塊插入到操作系統(tǒng)進程空間,用于攔截進程創(chuàng)建函數(shù),在系統(tǒng)調(diào)用進程創(chuàng)建函數(shù)時,將API鉤子模塊插入到新創(chuàng)建的進程空間中。
3.如權(quán)利要求2所述的準確獲取計算機屏幕變化的方法,其特征在于在步驟A中,所述的API鉤子模塊插入到新創(chuàng)建的進程空間后,執(zhí)行以下步驟a、遍歷進程中運行的所有模塊并為每個模塊掛接API鉤子;b、監(jiān)視操作系統(tǒng)的模塊加載函數(shù)并為獲取過程地址函數(shù)(GetProcAddress)掛接API鉤子;c、將所攔截API引起的變化區(qū)域信息轉(zhuǎn)化為矩形坐標發(fā)送給控制臺主模塊。
4.如權(quán)利要求2所述的準確獲取計算機屏幕變化的方法,其特征在于在步驟A中,所述的控制臺主模塊利用遠程線程創(chuàng)建函數(shù)將進程掛接模塊插入到操作系統(tǒng)進程空間。
5.如權(quán)利要求1所述的準確獲取計算機屏幕變化的方法,其特征在于在步驟B中,控制臺主模塊利用圖形驅(qū)動接口(GDI),或直接繪圖應(yīng)用程序接口(DirectDraw API)抓取屏幕變化區(qū)域的圖像。
6.如權(quán)利要求1所述的準確獲取計算機屏幕變化的方法,其特征在于在步驟A中,所述的消息鉤子模塊攔截系統(tǒng)消息與用戶輸入事件后,進入一消息處理函數(shù),該消息處理函數(shù)判斷上述消息或事件是否能夠引起屏幕變化,如是則將變化區(qū)域信息轉(zhuǎn)化為矩形坐標,發(fā)送給控制臺主模塊。
全文摘要
本發(fā)明公開了一種準確獲取計算機屏幕變化的方法,該方法至少包含以下步驟通過一個控制臺主模塊,在進程代碼執(zhí)行前完成一API鉤子模塊的掛接,該API鉤子模塊攔截圖像輸出函數(shù),獲取其輸出區(qū)域,并通過消息發(fā)送給控制臺主模塊;同時控制臺主模塊載入一消息鉤子模塊,為操作系統(tǒng)掛接消息鉤子,攔截用戶輸入事件以及引起屏幕變化的消息,并將該消息發(fā)送給控制臺主模塊,其次,控制臺主模塊處理接收到的消息流,合并屏幕變化的區(qū)域,抓取該區(qū)域的圖像。本發(fā)明由于在進程代碼執(zhí)行前完成掛接,因此能對系統(tǒng)的全部運行過程進行監(jiān)測,從而準確獲取屏幕的變化。本發(fā)明能夠可靠應(yīng)用于遠程監(jiān)控,電子教室等領(lǐng)域。
文檔編號G06F11/30GK1474267SQ0212602
公開日2004年2月11日 申請日期2002年8月9日 優(yōu)先權(quán)日2002年8月9日
發(fā)明者孫成昆, 劉渤, 趙俊先 申請人:聯(lián)想(北京)有限公司