本發(fā)明涉及測(cè)試領(lǐng)域,具體而言,涉及一種自動(dòng)尋窗的方法和裝置。
背景技術(shù):
在測(cè)試領(lǐng)域中,對(duì)于手機(jī)應(yīng)用(或者游戲)的測(cè)試,通常采用的方法是在完成自動(dòng)回歸測(cè)試腳本的編寫(xiě)后,可以通過(guò)一些工具軟件可以快速生成測(cè)試腳本;還可以將手機(jī)屏幕同步投射到PC屏幕上,以便操作者可以通過(guò)鼠標(biāo)的交互達(dá)到操作手機(jī)的目的。
其中,腳本錄制伴隨用戶(hù)的每一步鼠標(biāo)模擬操作,通過(guò)一些工具軟件可以同步地自動(dòng)生成相應(yīng)腳本,并記錄操作位置(以及對(duì)應(yīng)的操作截圖)以及操作類(lèi)型(例如,點(diǎn)擊、滑動(dòng)等)。在對(duì)腳本回放的過(guò)程中,可以將安卓手機(jī)(任何分辨率的手機(jī))連接至電腦(或者手機(jī)),并載入腳本,用戶(hù)點(diǎn)擊回放即可進(jìn)行腳本的回放。
假設(shè),對(duì)于手機(jī)A錄制的腳本,在手機(jī)B中回放時(shí),如果A和B的手機(jī)屏幕分辨率不同,則腳本中的截圖和手機(jī)實(shí)時(shí)屏幕中的對(duì)應(yīng)區(qū)域大小和位置均會(huì)有所不同。為此,錄制腳本的時(shí)候,需要將當(dāng)前游戲畫(huà)面的分辨率記錄下來(lái),供腳本運(yùn)行時(shí)使用。
例如,在實(shí)際應(yīng)用時(shí),為了能夠支持在游戲“xxx網(wǎng)游網(wǎng)頁(yè)版”上錄制的腳本能夠在手機(jī)上正常播放,就需要在錄制腳本時(shí)獲取當(dāng)前網(wǎng)頁(yè)中游戲窗口的大小,作為測(cè)試腳本中游戲畫(huà)面分辨率。由于在“xxx網(wǎng)游”的網(wǎng)頁(yè)版中是可以在網(wǎng)頁(yè)中通過(guò)Ctrl+滾輪的操作方式來(lái)使得相應(yīng)窗口放大和縮小。由于,在腳本錄制時(shí)我們并不知道當(dāng)前的游戲窗口的大小,因此需要一種解決方案,能夠在我們錄制腳本時(shí),自動(dòng)提供當(dāng)前游戲窗口的大小(單位:桌面像素值)。
目前的一種解決方案是獲取屏幕內(nèi)的指定視頻錄制區(qū)域,然后,抓取整個(gè)屏幕的圖像數(shù)據(jù),接下來(lái)提取所述指定視頻錄制區(qū)域內(nèi)的圖像數(shù)據(jù),最后,將提取出的所述指定視頻錄制區(qū)域圖像數(shù)據(jù)寫(xiě)入視頻文件。
如圖1所示,其欲采集圖1中大方框內(nèi)不規(guī)則四邊形和圓形的畫(huà)面,可以根據(jù)不規(guī)則四邊形和圓形的邊界,劃定外接矩形,錄制時(shí)截取外接矩形的畫(huà)面,并將外接矩形與不規(guī)則四邊形和圓形之間的部分填充成黑色像素,從而錄制結(jié)果中指定的不規(guī)則四邊形和圓形擁有正常畫(huà)面,其他畫(huà)面均為黑色。但是該方案僅敘述了錄制區(qū)域的獲 取方式,并未描述自動(dòng)獲取游戲子窗口位置大小數(shù)據(jù)。
因此,通過(guò)上述方式不能準(zhǔn)確獲取界面中每個(gè)窗口在屏幕中的準(zhǔn)確位置,也不能得知窗口的實(shí)際大小。
針對(duì)上述的問(wèn)題,目前尚未提出有效的解決方案。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供了一種自動(dòng)尋窗的方法和裝置,以至少解決現(xiàn)有技術(shù)中無(wú)法自動(dòng)獲取子窗口的位置和實(shí)際大小的技術(shù)問(wèn)題。
根據(jù)本發(fā)明實(shí)施例的一個(gè)方面,提供了一種自動(dòng)尋窗的方法,包括:獲取當(dāng)前時(shí)刻的界面上多個(gè)窗口的位置排列信息,其中,所述多個(gè)窗口包括一個(gè)或多個(gè)父窗口,所述一個(gè)或多個(gè)父窗口中的至少之一包括子窗口,所述子窗口為所述父窗口的嵌套窗口;獲取所述當(dāng)前時(shí)刻光標(biāo)在所述界面中的位置;根據(jù)所述位置和所述多個(gè)窗口的位置排列信息在所述多個(gè)窗口中查找所述光標(biāo)當(dāng)前位于的子窗口。
進(jìn)一步地,所述多個(gè)窗口的位置排列信息包括:父窗口的排列順序和子窗口的排列順序,獲取當(dāng)前時(shí)刻的界面上多個(gè)窗口的位置排列信息包括:獲取所述界面中的所有父窗口在所述界面中層疊的排列順序;獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序,得到所述多個(gè)窗口的位置排列信息。
進(jìn)一步地,獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序包括:獲取步驟,獲取所述每個(gè)父窗口的初始子窗口序列,其中,所述初始子窗口序列中包含所述每個(gè)父窗口的一個(gè)或多個(gè)子窗口的初始層疊和/或初始包含的排列順序;第一判斷步驟,依次將初始子窗口序列中第一子窗口之后的子窗口設(shè)置為目標(biāo)子窗口,判斷所述目標(biāo)子窗口是否被所述第一子窗口所包含,其中,所述第一子窗口為所述初始子窗口序列中的第一個(gè)子窗口;如果判斷出未被包含,則執(zhí)行第一循環(huán)步驟,如果判斷出被包含,則執(zhí)行調(diào)序步驟和第二循環(huán)步驟;所述第一循環(huán)步驟,將所述初始子窗口序列中的第二子窗口作為所述第一子窗口,返回執(zhí)行所述第一判斷步驟,其中,所述第二子窗口為所述初始子窗口序列中所述第一子窗口的后一個(gè)子窗口;直至所述初始子窗口序列中的子窗口全部被判斷;所述調(diào)序步驟,將所述第一子窗口與所述目標(biāo)子窗口在所述初始子窗口序列中的順序進(jìn)行調(diào)換,得到調(diào)換之后的子窗口序列;所述第二循環(huán)步驟,將所述調(diào)序步驟中所獲得的所述子窗口序列作為所述初始子窗口序列,返回執(zhí)行所述第一判斷步驟,直至所述初始子窗口序列中的子窗口全部被判斷。
進(jìn)一步地,獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序包括: 在所述每個(gè)父窗口的初始子窗口序列中遍歷每個(gè)子窗口,判斷是否包括與所述每個(gè)子窗口相同的子窗口;如果判斷出查找到所述相同的子窗口,則刪除所述相同的子窗口。
進(jìn)一步地,獲取所述界面中的所有父窗口在所述界面中層疊的排列順序包括:通過(guò)windows函數(shù)獲取所述界面中的所有父窗口在所述界面中層疊的排列順序。
進(jìn)一步地,所述判斷所述目標(biāo)子窗口是否被所述第一子窗口所包含包括:依據(jù)包含關(guān)系,判斷所述目標(biāo)子窗口是否被所述第一子窗口所包含,其中,所述包含關(guān)系包括:所述目標(biāo)子窗口與所述第一子窗口的面積不相等、且所述目標(biāo)子窗口的邊界包含于所述第一子窗口的范圍內(nèi)。
根據(jù)本發(fā)明實(shí)施例的另一方面,還提供了一種自動(dòng)尋窗的裝置,包括:第一獲取模塊,用于獲取當(dāng)前時(shí)刻的界面上多個(gè)窗口的位置排列信息,其中,所述多個(gè)窗口包括一個(gè)或多個(gè)父窗口,所述一個(gè)或多個(gè)父窗口中的至少之一包括子窗口,所述子窗口為所述父窗口的嵌套窗口;第二獲取模塊,用于獲取所述當(dāng)前時(shí)刻光標(biāo)在所述界面中的位置;查找模塊,用于根據(jù)所述位置和所述多個(gè)窗口的位置排列信息在所述多個(gè)窗口中查找所述光標(biāo)當(dāng)前位于的子窗口。
進(jìn)一步地,所述多個(gè)窗口的位置排列信息包括:父窗口的排列順序和子窗口的排列順序,所述第一獲取模塊包括:第一獲取單元,用于獲取所述界面中的所有父窗口在所述界面中層疊的排列順序;第二獲取單元,用于獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序,得到多個(gè)窗口的位置排列信息。
進(jìn)一步地,第二獲取單元包括:獲取子單元,用于獲取所述每個(gè)父窗口的初始子窗口序列,其中,所述初始子窗口序列中包含所述每個(gè)父窗口的一個(gè)或多個(gè)子窗口的初始層疊和/或初始包含的排列順序;第一判斷子單元,依次將初始子窗口序列中第一子窗口之后的子窗口設(shè)置為目標(biāo)子窗口,判斷所述目標(biāo)子窗口是否被所述第一子窗口所包含,其中,所述第一子窗口為所述初始子窗口序列中的第一個(gè)子窗口;如果判斷出未被包含,則執(zhí)行第一循環(huán)子單元,如果判斷出被包含,則執(zhí)行調(diào)序子單元和第二循環(huán)子單元;所述第一循環(huán)子單元,將所述初始子窗口序列中的第二子窗口作為所述第一子窗口,返回執(zhí)行所述第一判斷子單元,其中,所述第二子窗口為所述初始子窗口序列中所述第一子窗口的后一子窗口;直至所述初始子窗口序列中的子窗口全部被判斷;所述調(diào)序子單元,將所述第一子窗口與所述目標(biāo)子窗口在所述初始子窗口序列中的順序進(jìn)行調(diào)換,得到調(diào)換之后的子窗口序列;第二循環(huán)子單元,將所述調(diào)序子單元中所獲得的所述子窗口序列作為所述初始子窗口序列,返回執(zhí)行所述第一判斷子單元,直至所述初始子窗口序列中的子窗口全部被判斷。
進(jìn)一步地,所述第二獲取單元用于:在所述每個(gè)父窗口的初始子窗口序列中遍歷每個(gè)子窗口,判斷是否包括與所述每個(gè)子窗口相同的子窗口;如果判斷出查找到所述相同的子窗口,則刪除所述相同的子窗口。
進(jìn)一步地,所述第一獲取單元用于:通過(guò)windows函數(shù)獲取所述界面中的所有父窗口在所述界面中層疊的排列順序。
進(jìn)一步地,所述第一判斷子單元用于:依據(jù)包含關(guān)系,判斷所述目標(biāo)子窗口是否被所述第一子窗口所包含,其中,所述包含關(guān)系包括:所述目標(biāo)子窗口與所述第一子窗口的面積不相等、且所述目標(biāo)子窗口的邊界包含于所述第一子窗口的范圍內(nèi)。
在本發(fā)明實(shí)施例中,首先獲取當(dāng)前時(shí)刻界面中多個(gè)窗口的位置排列信息,然后,獲取當(dāng)前時(shí)刻光標(biāo)在界面中的位置,進(jìn)而根據(jù)光標(biāo)的位置和多個(gè)窗口的位置排列信息查找光標(biāo)當(dāng)前位于的子窗口,相對(duì)于現(xiàn)有技術(shù)中不能自動(dòng)獲取子窗口的方案,采用本發(fā)明實(shí)施例中,達(dá)到了靈活定位到子窗口的目的,從而實(shí)現(xiàn)了自動(dòng)準(zhǔn)確獲取子窗口的位置和實(shí)際大小的技術(shù)效果,進(jìn)而解決了現(xiàn)有技術(shù)中無(wú)法自動(dòng)獲取子窗口的位置和實(shí)際大小的技術(shù)問(wèn)題。
附圖說(shuō)明
此處所說(shuō)明的附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本發(fā)明的示意性實(shí)施例及其說(shuō)明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中:
圖1是根據(jù)現(xiàn)有技術(shù)的一種錄制區(qū)域的示意圖;
圖2是根據(jù)本發(fā)明實(shí)施例的一種自動(dòng)尋窗的方法的流程圖;
圖3是根據(jù)本發(fā)明實(shí)施例的一種可選地父窗口顯示示意圖;
圖4是根據(jù)本發(fā)明實(shí)施例的一種可選地父窗口和子窗口的顯示示意圖;
圖5是根據(jù)本發(fā)明實(shí)施例的另一種可選地父窗口和子窗口的顯示示意圖;
圖6是根據(jù)本發(fā)明實(shí)施例的一種可選地確定子窗口之間包含關(guān)系的示意圖;
圖7是根據(jù)本發(fā)明實(shí)施例的一種可選的自動(dòng)尋窗方法的流程圖;
圖8是根據(jù)本發(fā)明實(shí)施例的一種可選的父窗口和子窗口的顯示示意圖;
圖9是根據(jù)本發(fā)明實(shí)施例的另一種可選的父窗口和子窗口的顯示示意圖;
圖10是根據(jù)本發(fā)明實(shí)施例的一種可選地自動(dòng)尋窗的示意圖;
圖11是根據(jù)本發(fā)明實(shí)施例的一種可選地手動(dòng)尋窗的流程圖;以及
圖12是根據(jù)本發(fā)明實(shí)施例的一種自動(dòng)尋窗裝置的示意圖。
具體實(shí)施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分的實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本發(fā)明保護(hù)的范圍。
需要說(shuō)明的是,本發(fā)明的說(shuō)明書(shū)和權(quán)利要求書(shū)及上述附圖中的術(shù)語(yǔ)“第一”、“第二”等是用于區(qū)別類(lèi)似的對(duì)象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本發(fā)明的實(shí)施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤?。此外,術(shù)語(yǔ)“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過(guò)程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒(méi)有清楚地列出的或?qū)τ谶@些過(guò)程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
根據(jù)本發(fā)明實(shí)施例,提供了一種自動(dòng)尋窗的方法的實(shí)施例,需要說(shuō)明的是,在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
圖2是根據(jù)本發(fā)明實(shí)施例的一種自動(dòng)尋窗的方法的流程圖,如圖2所示,該方法包括如下步驟:
步驟S202,獲取當(dāng)前時(shí)刻的界面上多個(gè)窗口的位置排列信息,其中,多個(gè)窗口包括一個(gè)或多個(gè)父窗口,一個(gè)或多個(gè)父窗口中的至少之一包括子窗口,子窗口為該父窗口的嵌套窗口。
在本發(fā)明實(shí)施例中,上述界面可以為電腦的桌面,手機(jī)和ipad等智能終端設(shè)備的桌面;窗口可以為游戲的顯示窗口,可以為word的顯示窗口,還可以為文件夾顯示窗口等任一種窗口。參見(jiàn)圖3,桌面D為本發(fā)明實(shí)施例中的界面,A、B和C即為本發(fā)明實(shí)施例中的窗口,其中,A、B和C又可以稱(chēng)為本發(fā)明實(shí)施例中的父窗口,從圖3中可以看出,父窗口之間互相不存在嵌套關(guān)系。
步驟S204,獲取當(dāng)前時(shí)刻光標(biāo)在界面中的位置。
在本發(fā)明實(shí)施例中,光標(biāo)可以為電腦鼠標(biāo)的光標(biāo)指針,還可以手機(jī)等智能終端設(shè)備的光標(biāo)指針,其中,光標(biāo)由用戶(hù)控制在界面中的位置。獲取光標(biāo)在界面中的位置的方法可以有很多種,具體地,可以通過(guò)現(xiàn)有的Javascript腳本獲取光標(biāo)的位置。
步驟S206,根據(jù)位置和多個(gè)窗口的位置排列信息在多個(gè)窗口中查找光標(biāo)當(dāng)前位于的子窗口。
在本發(fā)明實(shí)施例中,在獲取到多個(gè)窗口的排列信息和光標(biāo)的位置之后,就可以根據(jù)上述信息在多個(gè)窗口中查找光標(biāo)當(dāng)前位于的子窗口了。例如,參見(jiàn)圖3,假設(shè),多個(gè)窗口的排列信息為:[a,A、B、C],其中,A、B、C之間具有層疊關(guān)系,即,B窗口部分遮擋C窗口,顯示在C窗口的上層,A窗口部分遮擋B窗口,顯示在B窗口的上層,窗口a為窗口A的一個(gè)子窗口;當(dāng)光標(biāo)位于符號(hào)“①”所示的位置時(shí),根據(jù)獲取到多個(gè)窗口的排列信息可知,光標(biāo)位于窗口A的子窗口a中,此時(shí),可以將窗口a的邊框加粗,或者設(shè)置窗口a鮮亮的顏色,以提示用戶(hù)當(dāng)前選取的子窗口為窗口a。
在本發(fā)明實(shí)施例中,首先獲取當(dāng)前時(shí)刻界面中多個(gè)窗口的位置排列信息,然后,獲取當(dāng)前時(shí)刻光標(biāo)在界面中的位置,進(jìn)而根據(jù)光標(biāo)的位置和多個(gè)窗口的位置排列信息查找光標(biāo)當(dāng)前位于的子窗口,相對(duì)于現(xiàn)有技術(shù)中不能自動(dòng)獲取子窗口的方案,采用本發(fā)明實(shí)施例中,達(dá)到了靈活定位到子窗口的目的,從而實(shí)現(xiàn)了自動(dòng)準(zhǔn)確獲取子窗口的位置和實(shí)際大小的技術(shù)效果,進(jìn)而解決了現(xiàn)有技術(shù)中無(wú)法自動(dòng)獲取子窗口的位置和實(shí)際大小的技術(shù)問(wèn)題。
在一個(gè)可選的實(shí)施方式中,多個(gè)窗口的位置排列信息包括父窗口的排列順序和子窗口的排列順序,在此情況下,獲取當(dāng)前時(shí)刻的界面上多個(gè)窗口的位置排列信息包括:獲取界面中的所有父窗口在界面中層疊的排列順序,然后,獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序,得到多個(gè)窗口的位置排列信息。
可選地,可以通過(guò)windows函數(shù)獲取界面中的所有父窗口在界面中層疊的排列順序。
在本發(fā)明實(shí)施例中,想要根據(jù)位置和多個(gè)窗口的位置排列信息在多個(gè)窗口中查找光標(biāo)當(dāng)前位于的子窗口,首先需要獲取界面中所有父窗口的層疊的排列順序,然后,再獲取每個(gè)父窗口中的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序,進(jìn)而才能根據(jù)光標(biāo)的位置實(shí)時(shí)查找光標(biāo)所在的子窗口,下面,將結(jié)合圖3和圖4對(duì)本發(fā)明可選實(shí)施方式進(jìn)行詳細(xì)說(shuō)明。
需要說(shuō)明的是,在本發(fā)明實(shí)施例中,層疊是指在界面中,一個(gè)窗口位于另一個(gè)窗口的上方或者下方,但是該窗口不包含于另一個(gè)與窗口中。參見(jiàn)圖3,按照層疊順序 的Z-order,層疊順序中更靠前的父窗口在前面,即,窗口A排在最前面,最靠后的父窗口在后面,即窗口C排在最后面,顯然,桌面窗口是最靠后的,排在最后面,其中,由于窗口a為窗口A的子窗口,因此,窗口a排列在窗口A的前面。從圖3中可以看出,窗口A、B、C之間不存在嵌套的關(guān)系。
在本發(fā)明下述實(shí)施例中,父窗口均用于大寫(xiě)字母來(lái)表示,子窗口均用小寫(xiě)字母來(lái)表示。
如圖3所示,假設(shè),包括有A、B、C和D這4個(gè)父窗口,其中,A是最靠前的窗口,B次之,C更次之,D是桌面窗口。那么獲取界面中所有父窗口的層疊的排列順序即為:A,B,C,D。
在本發(fā)明實(shí)施例中,父窗口A,B,C,D的排序是根據(jù)當(dāng)前父窗口的層疊順序Z-order進(jìn)行排序的,而父窗口的層疊順序Z-order是可以通過(guò)操作系統(tǒng)的接口方便地獲取??蛇x地,可以通過(guò)windows函數(shù)獲取所有父窗口在界面中層疊的排列順序,其中,windows函數(shù)可以為ctypes.windll.user32.GetWindow函數(shù),也就是說(shuō),可以通過(guò)ctypes.windll.user32.GetWindow函數(shù)獲取上述排列順序。
由于每個(gè)父窗口中可能包含子窗口,因此,在獲取完父窗口的排列順序之后,可以再獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序,其中,子窗口為完全嵌套于父窗口中的窗口,具體地,獲取每個(gè)父窗口中的一個(gè)或多個(gè)的層疊和/或包含的排列順序具體可以描述為以下內(nèi)容:
對(duì)于每個(gè)父窗口,可以獲取每個(gè)父窗口包含的所有子窗口的信息,即,子窗口的四個(gè)角的在屏幕坐標(biāo)系中的坐標(biāo)。獲取子窗口的信息的方式有很多種,在本發(fā)明實(shí)施例中,可以通過(guò)win32gui.EnumChildWindows(hwnd,function,None)進(jìn)行子窗口信息獲取。如圖3所示,通過(guò)win32gui.EnumChildWindows(hwnd,function,None)方法獲取到的子窗口為窗口a,即父窗口A的一個(gè)子窗口。此時(shí),在上述父窗口A、B、C、D的排序:A,B,C,D的基礎(chǔ)上,得到的多個(gè)窗口的位置排列信息為:a,A,B,C,D。
但是,如果父窗口A中子窗口的數(shù)量為多個(gè),通過(guò)上述方法獲取到的所有子窗口并不會(huì)按照任何的順序進(jìn)行排列,也就是說(shuō),通過(guò)上述方法獲取到的所有子窗口為亂序的。
因此,在本發(fā)明實(shí)施例中,需要將獲取到的多個(gè)子窗口按照子窗口的被包含關(guān)系進(jìn)行排序,保證任一個(gè)子窗口x的前面不存在任何包含子窗口x的子窗口。
參見(jiàn)圖4,可以通過(guò)win32gui.EnumChildWindows(hwnd,function,None)依次對(duì)每一個(gè)父窗口進(jìn)行子窗口遍歷,例如,遍歷窗口A時(shí),獲取到的子窗口為:a1、a2、a3、 a4,其中,從圖4中可以看出a2、a3、a4沒(méi)有互相包含,即,部分重疊。因此,a2、a3、a4的順序隨意,但是a1嵌套于a2中,因此,在父窗口的排列順序中,需要保證a1始終排在a2的前面。然而,對(duì)于單個(gè)父窗口A,父窗口A的所有子窗口a1、a2、a3、a4都被父窗口A包含,因此,A排在父窗口的排列順序的最后面。
因此,對(duì)于上述父窗口A,其所有窗口(包含父窗口A和父窗口A的子窗口)的排序可以為以下任一種:{a1,a2,a3,a4,A};{a4,a1,a3,a2};{a3,a1,a4,a2},也就是說(shuō),在上述父窗口A的排列順序中,只要保證父窗口A排在最后的位置,a1排在a2的前面即可。需要說(shuō)明的是,{a1,a2,a3,a4,A};{a4,a1,a3,a2};{a3,a1,a4,a2}即為父窗口A的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序。
在下述實(shí)施例中,將通過(guò)下述獲取步驟、第一判斷步驟、第一循環(huán)步驟和調(diào)序步驟和第二循環(huán)步驟具體介紹獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序:
獲取步驟,獲取每個(gè)父窗口的初始子窗口序列,其中,初始子窗口序列中包含每個(gè)父窗口的一個(gè)或多個(gè)子窗口的初始層疊和/或初始包含的排列順序;
第一判斷步驟,依次將初始子窗口序列中第一子窗口之后的子窗口設(shè)置為目標(biāo)子窗口,判斷目標(biāo)子窗口是否被第一子窗口所包含,其中,第一子窗口為初始子窗口序列中的第一個(gè)子窗口;如果判斷出未被包含,則執(zhí)行第一循環(huán)步驟,如果判斷出被包含,則執(zhí)行調(diào)序步驟和第二循環(huán)步驟;
第一循環(huán)步驟,將初始子窗口序列中的第二子窗口作為第一子窗口,并返回執(zhí)行第一判斷步驟,其中,第二子窗口為初始子窗口序列中第一子窗口的后一個(gè)子窗口;直至初始子窗口序列中的子窗口全部被判斷;
調(diào)序步驟,將第一子窗口與目標(biāo)子窗口在初始子窗口序列中的順序進(jìn)行調(diào)換,得到調(diào)換之后的子窗口序列;
第二循環(huán)步驟,將調(diào)序步驟中所獲得的子窗口序列作為初始子窗口序列,返回執(zhí)行第一判斷步驟,直至初始子窗口序列中的子窗口全部被判斷。
下面將結(jié)合附圖5對(duì)本發(fā)明實(shí)施例進(jìn)行說(shuō)明。
在獲取每個(gè)父窗口中的一個(gè)或多個(gè)子窗口的初始層疊和/或初始包含的排列順序之前,可以先獲取通過(guò)方法win32gui.EnumChildWindows(hwnd,function,None)獲取到的每個(gè)父窗口的初始層疊和/或初始包含的排列序列,即每個(gè)父窗口的初始子窗口序列。然后,以初始子窗口序列的第一個(gè)子窗口(也即,第一子窗口)開(kāi)始,依次掃描并移 動(dòng)的操作。
參見(jiàn)圖5,假設(shè),在圖5所示的父窗口A中,首先執(zhí)行獲取步驟,即通過(guò)win32gui.EnumChildWindows(hwnd,function,None)方法獲取到的初始子窗口序列為:[a,b,c,d,e,f]。然后,執(zhí)行第一判斷步驟,即,將序列[a,b,c,d,e,f]中的第一個(gè)子窗口a作為第一子窗口,并將第一子窗口之后的子窗口設(shè)置為目標(biāo)子窗口,依次遍歷目標(biāo)子窗口b、c、d、e、f,判斷目標(biāo)子窗口是否被第一子窗口a包含。通過(guò)上述判斷可知,在子窗口b、c、d、e、f中未發(fā)現(xiàn)有被a包含的子窗口。
接下來(lái),執(zhí)行第一循環(huán)步驟,即獲取[a,b,c,d,e,f]中的第二個(gè)子窗口b(也即,第二子窗口),然后,將該第二子窗口b作為第一子窗口,重復(fù)執(zhí)行第一判斷步驟,即依次遍歷其后面的子窗口c、d、e、f,判斷是否均沒(méi)有被b包含。其中,那么遍歷到d的時(shí)候,通過(guò)判斷可知子窗口d被b包含,于是執(zhí)行調(diào)序步驟,即將子窗口d和子窗口b的順序調(diào)換,得到調(diào)換之后的初始子窗口序列,即[a,d,c,b,e,f]。
然后,結(jié)束獲取步驟、第一判斷步驟、第一循環(huán)步驟和調(diào)序步驟的循環(huán),執(zhí)行下一次循環(huán)的步驟,即將調(diào)換之后得到的子窗口序列作為初始子窗口,返回執(zhí)行第一判斷步驟和第一循環(huán)步驟,得到每個(gè)父窗口的層疊和/或包含的排列順序,直至不再執(zhí)行調(diào)序步驟。即,對(duì)于上述調(diào)換之后的子窗口序列[a,d,f,b,e,c],再次執(zhí)行上述獲取步驟、第一判斷步驟、第一循環(huán)步驟和調(diào)序步驟所描述的步驟。
具體地,將序列[a,d,f,b,e,c]中的第一個(gè)子窗口a作為第一子窗口,并將第一子窗口之后的子窗口設(shè)置為目標(biāo)子窗口,執(zhí)行第一判斷步驟,依次遍歷其后面的子窗口d,f,b,e,c,判斷是否均沒(méi)有被a包含。通過(guò)判斷可知,子窗口d,f,b,e,c未被a包含的子窗口。接下來(lái),將序列[a,d,f,b,e,c]中的第二個(gè)子窗口d(即第二子窗口)作為第一子窗口,再次執(zhí)行第一判斷步驟,即依次遍歷其后面的子窗口f,b,e,c,判斷是否均沒(méi)有被d包含。通過(guò)判斷可知,在子窗口f,b,e,c未被d包含的子窗口。然后,通過(guò)對(duì)f,b,e,c的判斷可知,判斷均沒(méi)有被f包含、被b包含、被e包含、被c包含的子窗口。因此,最終得到的父窗口A的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序即為:[a,d,f,b,e,c]。
通過(guò)上述獲取步驟、第一判斷步驟、第一循環(huán)步驟、調(diào)序步驟可知,對(duì)于排列中的每一個(gè)子窗口x,排在它后面的子窗口均沒(méi)有被子窗口x所包含,那么排列滿(mǎn)足要求,此時(shí),可以將預(yù)先設(shè)置的循環(huán)標(biāo)記位flag設(shè)置為無(wú)效(例如,false),然后,停止循環(huán),其中,循環(huán)標(biāo)記位flag為研發(fā)人員預(yù)先設(shè)置的作為循環(huán)是否結(jié)束的條件。
在本發(fā)明的一個(gè)可選實(shí)施方式中,判斷目標(biāo)子窗口是否被第一子窗口所包含包括: 依據(jù)包含關(guān)系,判斷目標(biāo)子窗口是否被第一子窗口所包含,其中,包含關(guān)系包括:目標(biāo)子窗口與第一子窗口的面積不相等、且目標(biāo)子窗口的邊界包含于第一子窗口的范圍內(nèi)。
參見(jiàn)圖6,在獲取如圖6所示的子窗口時(shí),可以獲得子窗口在屏幕坐標(biāo)系中左上角和右下角的坐標(biāo)。如圖6所示,子窗口d左上角的坐標(biāo)為(x1,y1),子窗口d右下角坐標(biāo)為(x2,y2);子窗口b左上角坐標(biāo)(x3,y3)和子窗口右下角坐標(biāo)(x4,y4)。
因此,想要判定子窗口d包含于子窗口b中,需要滿(mǎn)足以下兩條件:
第一個(gè)條件:邊界包含,即滿(mǎn)足以下兩個(gè)子條件:
①x1≥x3且y1≥y3;②x2≤x4且y2≤y4;
第二個(gè)條件:面積不等,即滿(mǎn)足以下兩個(gè)子條件:
子窗口d的面積Sd=(x2-x1)*(y2-y1),子窗口b的面積Sb=(x4-x3)*(y4-y3);并且需要Sd<Sb成立。
因此,只有邊界包含和面積不等條件同時(shí)成立時(shí),才能判定包含關(guān)系成立。
需要說(shuō)明的是,在本發(fā)明實(shí)施例中,在獲取上述初始子窗口序列時(shí),經(jīng)常會(huì)出現(xiàn)一些非常微小的子窗口,其并不符合錄制窗口的期望,因此需要對(duì)初始子窗口序列進(jìn)行過(guò)濾;同時(shí),桌面父窗口也會(huì)有一些異常的子窗口,同樣需要進(jìn)行過(guò)濾;有時(shí)在初始子窗口序列中會(huì)出現(xiàn)較多的重復(fù)窗口,重復(fù)窗口降低了窗口的排序效率,因此可以進(jìn)行子窗口去重。
因此,在本發(fā)明的一個(gè)可選實(shí)施方式中,可以在每個(gè)父窗口的初始子窗口序列中遍歷每個(gè)子窗口,判斷是否包括與每個(gè)窗口相同的子窗口,然后,如果判斷出查找到相同的子窗口,則刪除相同的子窗口。
下面結(jié)合具體的實(shí)施例對(duì)本發(fā)明提供的自動(dòng)尋窗方法進(jìn)行具體地介紹。
實(shí)施例一
圖7是根據(jù)本發(fā)明實(shí)施例的一種可選的自動(dòng)尋窗方法的流程圖,如圖7所示,該方法包括如下步驟:
步驟S702,開(kāi)始尋找窗口,其中,尋找窗口包括以下任一種方式:自動(dòng)尋窗和手動(dòng)尋窗,其中,如圖10所示的即為一種自動(dòng)尋窗的方法,即用戶(hù)在任一個(gè)界面中選擇 自動(dòng)尋窗之后,就可以實(shí)現(xiàn)窗口的自動(dòng)尋找;如圖11所示的即為一種手動(dòng)尋窗方法,即,用戶(hù)可以在如圖11所示的界面中手動(dòng)輸入要查找的窗口的左上角坐標(biāo)和錄制區(qū)的寬高,來(lái)實(shí)現(xiàn)手動(dòng)尋窗。
步驟S704,獲取窗口序列,以及實(shí)時(shí)追蹤鼠標(biāo)的位置;其中,獲取到的窗口序列包括父窗口的排列順序和每個(gè)父窗口中子窗口的排列順序,具體獲取父窗口的排列順序和每個(gè)父窗口中子窗口的排列順序的方法已在上述進(jìn)行描述,此處不再描述。
步驟S706:實(shí)時(shí)定位鼠標(biāo)所在子窗口;其中,可以在每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序中定位鼠標(biāo)(即,上述光標(biāo))所在的子窗口。
步驟S708:選中目標(biāo)窗口,其中,當(dāng)在步驟S706中,定位到鼠標(biāo)所在子窗口之后,會(huì)將其邊框加粗,并顯示在界面中,以提示用戶(hù)當(dāng)前定位到的子窗口。其中,如果用戶(hù)確定,并點(diǎn)擊鼠標(biāo),將向服務(wù)器發(fā)送一個(gè)確定指令,服務(wù)器在獲取到該確定指令之后,就可以將當(dāng)前的子窗口的信息返回,實(shí)現(xiàn)子窗口的錄制。
采用本發(fā)明實(shí)施例中,在進(jìn)入“尋找窗口”功能之后,當(dāng)光標(biāo)移動(dòng)到某個(gè)位置時(shí),可以自動(dòng)提取出按照層疊順序最靠前的父窗口中的子窗口(即上述光標(biāo)當(dāng)前位于的子窗口),并進(jìn)行對(duì)應(yīng)子窗口的邊框繪制加粗。隨著光標(biāo)的移動(dòng),如果發(fā)生光標(biāo)所在的子窗口變更情況,則繪制出變更后的子窗口的邊框繪制加粗,取消上一個(gè)選擇的子窗口加粗的顯示。
實(shí)施例二:
圖8是根據(jù)本發(fā)明實(shí)施例的一種可選的父窗口和子窗口的顯示示意圖。
參見(jiàn)圖8,通過(guò)上述win32gui.EnumChildWindows(hwnd,function,None)方法獲取到的父窗口A的初始子窗口序列為:[a4,a2,a3,a1];此時(shí),可以設(shè)置一個(gè)循環(huán)標(biāo)記位,例如,設(shè)置循環(huán)標(biāo)記位flag為T(mén)rue,然后開(kāi)始循環(huán),其中,此處所執(zhí)行的循環(huán)即為上述第一判斷步驟、第一循環(huán)步驟和調(diào)換步驟。
首先執(zhí)行上述第一判斷步驟:對(duì)于序列[a4,a2,a3,a1]中的首個(gè)子窗口a4,依次查看子窗口a4后面的子窗口a2-a3-a4是否被a4包含,通過(guò)判斷可知,發(fā)現(xiàn)a2-a3-a4并沒(méi)有被a4包含;
接下來(lái)將第二個(gè)子窗口a2作為第一子窗口,繼續(xù)執(zhí)行第一判斷步驟,依次查看子窗口a3-a1是否被a2包含,通過(guò)判斷可知a1被a2包含,那么將序列[a4,a2,a3,a1]中的a1和a2交換位置,即執(zhí)行調(diào)換步驟,調(diào)換順序之后的[a4,a2,a3,a1]變?yōu)閇a4, a1,a3,a2];
在執(zhí)行調(diào)換步驟后,對(duì)調(diào)換順序之后的[a4,a1,a3,a2]重新進(jìn)行上述循環(huán),即:
首先執(zhí)行上述第一判斷步驟:對(duì)于當(dāng)前排列的第一個(gè)子窗口a4,依次查看a1-a3-a2是否被其包含,通過(guò)判斷可知,發(fā)現(xiàn)a2-a3-a4并沒(méi)有被a4包含;
接下來(lái),將第二個(gè)子窗口a1(即,第二子窗口)作為第一子窗口,繼續(xù)執(zhí)行第一判斷步驟,對(duì)于第二個(gè)子窗口a1,依次查看a3-a2是否被其包含,通過(guò)判斷可知,發(fā)現(xiàn)a3-a2并沒(méi)有被a1包含;
接下來(lái),將第三個(gè)子窗口a3作為第一子窗口,繼續(xù)執(zhí)行第一判斷步驟,對(duì)于第三個(gè)子窗口a3,依次查看a2是否被其包含,通過(guò)判斷可知,a2并沒(méi)有被a3所包含;
接下來(lái),將第四個(gè)子窗口a2作為第一子窗口,繼續(xù)執(zhí)行第一判斷步驟,對(duì)于第四個(gè)子窗口a2,發(fā)現(xiàn)其為最后一個(gè)元素,當(dāng)前沒(méi)有發(fā)生子窗口的交換事件,將循環(huán)標(biāo)記為flag標(biāo)記為False,循環(huán)結(jié)束。然后,返回最后一次循環(huán)結(jié)束后的子窗口排列[a4,a1,a3,a2],將該結(jié)果作為父窗口A的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序。
實(shí)施例三:
圖9是根據(jù)本發(fā)明實(shí)施例的另一種可選的父窗口和子窗口的顯示示意圖。
參見(jiàn)圖9中,從圖9中可以看出包括父窗口A、B、C、D,通過(guò)調(diào)用Windows函數(shù),即ctypes.windll.user32.GetWindow,可以得到所有父窗口A、B、C、D在界面中層疊的排列順序,即:[A,B,C,D]。
接下來(lái),獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序,具體獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序的方法如上述實(shí)施例二中所描述,此處不再贅述。
假設(shè),通過(guò)上述方法獲取到的父窗口A、B、C、D的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序分別可以表示為:
父窗口A:[a4,a1,a3,a2];父窗口B:[b4,b1,b3,b2];父窗口C:[c4,c1,c3,c2];父窗口D:[d4,d1,d3,d2];其中,[b4,b1,b3,b2];[c4,c1,c3,c2]和[d4,d1,d3,d2]在圖9中未示出。
然后,將父窗口A、B、C、D的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序與 父窗口的排列順序進(jìn)行合并,得到多個(gè)窗口的位置排列信息,即:
[a4,a1,a3,a2,A,b4,b1,b3,b2,B,c4,c1,c3,c2,C,d4,d1,d3,d2,D]。
獲取到多個(gè)窗口的位置排列信息之后,可以根據(jù)光標(biāo)的位置和多個(gè)窗口的位置排列信息在多個(gè)窗口中查找光標(biāo)當(dāng)前位于的子窗口。其中,當(dāng)光標(biāo)選擇進(jìn)入自動(dòng)尋窗模式時(shí),可以在計(jì)算出多個(gè)窗口的位置排列信息中查找光標(biāo)當(dāng)前位于的子窗口。如果光標(biāo)位于該子窗口內(nèi),則該子窗口即為當(dāng)前時(shí)刻光標(biāo)當(dāng)前位于的子窗口,并將該子窗口的邊框進(jìn)行繪制描粗。
例如,光標(biāo)位于符號(hào)“①”所示的位置,則從多個(gè)窗口的位置排列信息中依次查找光標(biāo)當(dāng)前位于的子窗口。通過(guò)查找可知,發(fā)現(xiàn)a4不是,繼續(xù)查找可知a1滿(mǎn)足要求,則直接將a1進(jìn)行作為光標(biāo)當(dāng)前位于的子窗口,并進(jìn)行描粗。
需要說(shuō)明的是,如果光標(biāo)一直在a1的范圍內(nèi)移動(dòng),則查找到的光標(biāo)當(dāng)前位于的子窗口(即,子窗口a1)不發(fā)生變動(dòng),無(wú)需更換。如果光標(biāo)的位置從符號(hào)“①”所示的位置移動(dòng)到符號(hào)“②”所示的位置,那么光標(biāo)當(dāng)前位于的子窗口實(shí)時(shí)判定的光標(biāo)當(dāng)前位于的子窗口變?yōu)榱薬2,此時(shí),進(jìn)行a1的取消描粗和a2的描粗即可。當(dāng)光標(biāo)位于符號(hào)“③”、符號(hào)“④”、符號(hào)“⑤”所示的位置時(shí),查找流程與上述符號(hào)“①”和符號(hào)“②”為同一流程,此處不再贅述。
在本實(shí)施例中還提供了一種自動(dòng)尋窗裝置,該自動(dòng)尋窗裝置中的各個(gè)模塊對(duì)應(yīng)于上述實(shí)施例及可選實(shí)施方式中的步驟,已經(jīng)進(jìn)行過(guò)說(shuō)明的在以下實(shí)施例中就不再贅述。
圖12是根據(jù)本發(fā)明實(shí)施例的一種自動(dòng)尋窗裝置的示意圖,如圖12所示,該裝置包括:
第一獲取模塊121,用于獲取當(dāng)前時(shí)刻的界面上多個(gè)窗口的位置排列信息,其中,多個(gè)窗口包括一個(gè)或多個(gè)父窗口,一個(gè)或多個(gè)父窗口中的至少之一包括子窗口,子窗口為該父窗口的嵌套窗口;
第二獲取模塊123,用于獲取當(dāng)前時(shí)刻光標(biāo)在界面中的位置;
查找模塊125,用于根據(jù)位置和多個(gè)窗口的位置排列信息在多個(gè)窗口中查找光標(biāo)當(dāng)前位于的子窗口。
在本發(fā)明實(shí)施例中,在獲取到多個(gè)窗口的排列信息和光標(biāo)的位置之后,就可以根據(jù)上述信息在多個(gè)窗口中查找光標(biāo)當(dāng)前位于的子窗口了。例如,參見(jiàn)圖3,假設(shè),多個(gè)創(chuàng)號(hào)的排列信息為:[A、B、C],其中,A、B、C之間具有層疊關(guān)系,即,B窗口 顯示在C窗口的上層,A窗口顯示在B窗口的上層;當(dāng)光標(biāo)位于符號(hào)“①”所示的位置時(shí),根據(jù)獲取到多個(gè)窗口的排列信息可知,光標(biāo)位于窗口A中,此時(shí),可以將窗口的邊框加粗,或者設(shè)置鮮亮的顏色,以提示用于當(dāng)前選取的窗口為窗口A。
作為一個(gè)可選的實(shí)施方式,多個(gè)窗口的位置排列信息包括:父窗口的排列順序和子窗口的排列順序,第一獲取模塊包括:第一獲取單元,用于獲取界面中的所有父窗口在界面中層疊的排列順序;第二獲取單元,用于獲取每個(gè)父窗口的一個(gè)或多個(gè)子窗口的層疊和/或包含的排列順序,得到多個(gè)窗口的位置排列信息。
作為一個(gè)可選的實(shí)施方式,第二獲取單元包括:獲取子單元,用于獲取每個(gè)父窗口的初始子窗口序列,其中,初始子窗口序列中包含每個(gè)父窗口的一個(gè)或多個(gè)子窗口的初始層疊和/或初始包含的排列順序;第一判斷子單元,依次將初始子窗口序列中第一子窗口之后的子窗口設(shè)置為目標(biāo)子窗口,判斷目標(biāo)子窗口是否被第一子窗口所包含,其中,第一子窗口為初始子窗口序列中的第一個(gè)子窗口;如果判斷出未被包含,則執(zhí)行第一循環(huán)子單元,如果判斷出被包含,則執(zhí)行調(diào)序子單元和第二循環(huán)子單元;第一循環(huán)子單元,將初始子窗口序列中的第二子窗口作為第一子窗口,返回執(zhí)行第一判斷子單元,其中,第二子窗口為初始子窗口序列中第一子窗口的后一子窗口;直至初始子窗口序列中的子窗口全部被判斷;調(diào)序子單元,將第一子窗口與目標(biāo)子窗口在初始子窗口序列中的順序進(jìn)行調(diào)換,得到調(diào)換之后的子窗口序列;第二循環(huán)子單元,將調(diào)序子單元中所獲得的子窗口序列作為初始子窗口序列,返回執(zhí)行第一判斷子單元,直至初始子窗口序列中的子窗口全部被判斷。
作為一個(gè)可選的實(shí)施方式,第二獲取單元用于:在每個(gè)父窗口的初始子窗口序列中遍歷每個(gè)子窗口,判斷是否包括與每個(gè)窗口相同的子窗口;如果判斷出查找到相同的子窗口,則刪除相同的子窗口。
作為一個(gè)可選的實(shí)施方式,第一獲取單元用于:通過(guò)windows函數(shù)獲取界面中的所有父窗口在界面中層疊的排列順序。
作為一個(gè)可選的實(shí)施方式,第一判斷子單元用于:依據(jù)包含關(guān)系,判斷目標(biāo)子窗口是否被第一子窗口所包含,其中,包含關(guān)系包括:目標(biāo)子窗口與第一子窗口的面積不相等、且目標(biāo)子窗口的邊界包含于第一子窗口的范圍內(nèi)。
上述本發(fā)明實(shí)施例序號(hào)僅僅為了描述,不代表實(shí)施例的優(yōu)劣。
在本發(fā)明的上述實(shí)施例中,對(duì)各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒(méi)有詳述的部分,可以參見(jiàn)其他實(shí)施例的相關(guān)描述。
在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的技術(shù)內(nèi)容,可通過(guò)其它 的方式實(shí)現(xiàn)。其中,以上所描述的裝置實(shí)施例僅僅是示意性的,例如所述單元的劃分,可以為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。
另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以?xún)蓚€(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷(xiāo)售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可為個(gè)人計(jì)算機(jī)、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤(pán)、只讀存儲(chǔ)器(ROM,Read-Only Memory)、隨機(jī)存取存儲(chǔ)器(RAM,Random Access Memory)、移動(dòng)硬盤(pán)、磁碟或者光盤(pán)等各種可以存儲(chǔ)程序代碼的介質(zhì)。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視為本發(fā)明的保護(hù)范圍。