一種操作注冊(cè)表的方法及裝置制造方法
【專利摘要】本發(fā)明公開(kāi)了一種操作注冊(cè)表的方法及其裝置。該方法包括:?jiǎn)?dòng)注冊(cè)表編輯器;獲取所述注冊(cè)表編輯器的窗口句柄;根據(jù)所述窗口句柄通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作。本發(fā)明通過(guò)調(diào)用界面函數(shù)啟動(dòng)注冊(cè)表編輯器,并調(diào)用界面函數(shù)對(duì)注冊(cè)表進(jìn)行操作,能夠?qū)崿F(xiàn)操作注冊(cè)表功能的合法性,能夠保證對(duì)注冊(cè)表的進(jìn)行安全操作,同時(shí)也確保了系統(tǒng)的安全性。
【專利說(shuō)明】一種操作注冊(cè)表的方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種操作注冊(cè)表的方法及裝置。
【背景技術(shù)】
[0002]注冊(cè)表在Windows系統(tǒng)的配置和控制方面扮演了一個(gè)非常關(guān)鍵的角色,其是系統(tǒng)全局設(shè)置和用戶設(shè)置形象的存儲(chǔ)倉(cāng)庫(kù),也是Windows執(zhí)行體和內(nèi)核所維護(hù)的各種內(nèi)存中數(shù)據(jù)結(jié)構(gòu)的一個(gè)窗口,所有的軟件信息和硬件信息都是通過(guò)注冊(cè)表來(lái)管理的。如果注冊(cè)表由于某種原因受到破壞,輕者使Windows的啟動(dòng)過(guò)程出現(xiàn)異常,重者可能會(huì)導(dǎo)致整個(gè)Windows系統(tǒng)的完全癱瘓。為了保護(hù)注冊(cè)表,Windows提供兩種常規(guī)的操作方法:一種是注冊(cè)表編輯器Regedit.exe,即通過(guò)用戶界面來(lái)操作;另一種是提供大量的API供用戶訪問(wèn)和修改注冊(cè)表中的數(shù)據(jù)。用戶通過(guò)注冊(cè)表編輯器看到的注冊(cè)表結(jié)構(gòu)是經(jīng)過(guò)注冊(cè)表編輯器讀取之后呈現(xiàn)給用戶的,其磁盤形式并不是一個(gè)簡(jiǎn)單的大文件,而是一組HIVE文件形式。
[0003]從Inte 180386開(kāi)始,出于安全性和穩(wěn)定性的考慮,該系列的CPU可以運(yùn)行于ringO?ring3從高到低四個(gè)不同的權(quán)限級(jí),對(duì)數(shù)據(jù)也提供相應(yīng)的四個(gè)保護(hù)級(jí)別。其中ringO優(yōu)先級(jí)最高,用于操作內(nèi)核;ringl和ring2都用于操作系統(tǒng)服務(wù);ring3優(yōu)先級(jí)最低,用于應(yīng)用程序。運(yùn)行于較低級(jí)別的代碼不能隨意調(diào)用高級(jí)別的代碼和訪問(wèn)較高級(jí)別的數(shù)據(jù),而且也只有運(yùn)行在ringO層的代碼可以直接對(duì)物理硬件進(jìn)行訪問(wèn)。
[0004]圖1示出了 Windows操作系統(tǒng)利用CPU運(yùn)行級(jí)別的圖形化示意圖。如圖1所示,Windows只利用了 CPU的兩個(gè)運(yùn)行級(jí)別。一個(gè)被稱為內(nèi)核模式,即對(duì)應(yīng)80 X 86的ringO層,是操作系統(tǒng)的核心部分,設(shè)備驅(qū)動(dòng)程序就是運(yùn)行在該模式下;另一個(gè)被稱為用戶模式,即對(duì)應(yīng)80X86的ring3層,操作系統(tǒng)的用戶接口部分(Win API)以及所有的用戶應(yīng)用程序都運(yùn)打在該級(jí)別。
[0005]Windows對(duì)運(yùn)行在內(nèi)核模式組件的空間并不提供讀/寫保護(hù),但是在裝有殺毒軟件等安全軟件的機(jī)器上,如果調(diào)用內(nèi)核模式下的注冊(cè)表API對(duì)注冊(cè)表進(jìn)行危險(xiǎn)操作,殺毒軟件等防護(hù)軟件就會(huì)對(duì)相應(yīng)的注冊(cè)表API調(diào)用進(jìn)行攔截,更有可能直接攔截調(diào)用此類API的應(yīng)用程序,以防止其破壞系統(tǒng)的安全。
[0006]注冊(cè)表是系統(tǒng)的關(guān)鍵部位,病毒和惡意軟件常常會(huì)在注冊(cè)表的啟動(dòng)項(xiàng)里面寫入自己的啟動(dòng)鍵值來(lái)達(dá)到自啟動(dòng)的目的,有些病毒還會(huì)修改注冊(cè)表內(nèi)容來(lái)映像劫持殺毒軟件。通常殺毒軟件會(huì)對(duì)注冊(cè)表進(jìn)行監(jiān)控,或者對(duì)注冊(cè)表保護(hù)項(xiàng)進(jìn)行保護(hù),防止惡意程序或者病毒篡改注冊(cè)表,從而破壞系統(tǒng)。調(diào)用系統(tǒng)API的程序,在運(yùn)行的過(guò)程中對(duì)注冊(cè)表的操作也處于殺毒軟件監(jiān)控之下。第三方軟件的運(yùn)行方式是通過(guò)主動(dòng)調(diào)用系統(tǒng)API函數(shù)進(jìn)行注冊(cè)表操作,但這種方式在大多數(shù)情況下都會(huì)觸碰到安全軟件的防護(hù)策略,導(dǎo)致第三方軟件被直接攔截執(zhí)行,這樣就無(wú)法實(shí)現(xiàn)自動(dòng)化程序去模擬一些真實(shí)的測(cè)試環(huán)境,進(jìn)行有效測(cè)試工作。
[0007]現(xiàn)有技術(shù)中,第三方軟件操作注冊(cè)表通常是采用Windows API中提供的函數(shù)來(lái)實(shí)現(xiàn),比如 RegCreateKey, RegCreateKeyEx, RegSetValueEx, RegDeleteValue 等,通過(guò)這些函數(shù)可以對(duì)注冊(cè)表進(jìn)行讀取,寫入,刪除,以及打開(kāi)操作。[0008]這種通過(guò)Windows API訪問(wèn)和修改注冊(cè)表中的數(shù)據(jù),需要層層調(diào)用轉(zhuǎn)移,由內(nèi)核的注冊(cè)表API再調(diào)用文件系統(tǒng)的驅(qū)動(dòng)等,去訪問(wèn)磁盤上的HIVE文件,并最終返回請(qǐng)求的數(shù)據(jù)結(jié)果。如果程序運(yùn)行在有保護(hù)機(jī)制的環(huán)境(比如安裝殺毒軟件)中,很可能會(huì)被攔截,不能正確執(zhí)行。并且這些API并不是所有平臺(tái)都適用,如NT和Windows98都是32位操作系統(tǒng),但是有些API函數(shù)中并不支持Windows98。
[0009]現(xiàn)有技術(shù)中第三方軟件操作注冊(cè)表使用的常規(guī)方法存在以下的主要缺點(diǎn):
[0010]I)可移植性低。
[0011]2)執(zhí)行有效性低。
[0012]3)運(yùn)行環(huán)境受限。
[0013]4)在存在防護(hù)軟件的環(huán)境下有各種被誤報(bào)的風(fēng)險(xiǎn)。
[0014]而現(xiàn)有技術(shù)中也有通過(guò)技術(shù)手段hook API或者對(duì)殺毒軟件進(jìn)行攻防操作的行為,但是其過(guò)程較為繁瑣同時(shí)不具備通用性以及合法性。
[0015]因此提供一種合理并且通用的方式,在與各種殺毒軟件或者防護(hù)軟件并存的情況下,能夠通過(guò)調(diào)用內(nèi)核模式下的注冊(cè)表API對(duì)注冊(cè)表進(jìn)行操作,同時(shí)能防止殺毒軟件等防護(hù)軟件的攔截,是非常必要的。
【發(fā)明內(nèi)容】
[0016]為解決現(xiàn)有技術(shù)中存在的上述問(wèn)題,本發(fā)明提供了一種操作注冊(cè)表的方法及其裝置。
[0017]根據(jù)本發(fā)明的一個(gè)方面,其提供了一種操作注冊(cè)表的方法,包括:
[0018]啟動(dòng)注冊(cè)表編輯器;
[0019]獲取所述注冊(cè)表編輯器的窗口句柄;
[0020]根據(jù)所述窗口句柄通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作。
[0021]可選地,所述通過(guò)調(diào)用界面函數(shù)對(duì)注冊(cè)表進(jìn)行操作包括:獲取注冊(cè)表編輯器的菜單項(xiàng),模擬鼠標(biāo)和/或鍵盤對(duì)所述菜單項(xiàng)進(jìn)行操作。
[0022]可選地,獲取注冊(cè)表編輯器的菜單項(xiàng)包括:
[0023]獲取系統(tǒng)所有頂級(jí)窗口句柄,形成第一窗口句柄列表;
[0024]在預(yù)定位置模擬鼠標(biāo)點(diǎn)擊操作;
[0025]在預(yù)定時(shí)間間隔內(nèi),再次獲取系統(tǒng)所有頂級(jí)窗口句柄,形成第二窗口句柄列表;
[0026]獲取第一窗口句柄列表和第二窗口句柄列表的差集;
[0027]從所述差集中獲取菜單的窗口句柄;
[0028]根據(jù)所述菜單的窗口句柄獲取菜單項(xiàng)。
[0029]可選地,所述通過(guò)調(diào)用界面函數(shù)對(duì)注冊(cè)表進(jìn)行操作包括:獲取展開(kāi)鍵坐標(biāo)和/或鍵值項(xiàng)坐標(biāo),并模擬鼠標(biāo)進(jìn)行操作。
[0030]可選地,獲取展開(kāi)鍵坐標(biāo)包括:
[0031]獲取注冊(cè)表編輯器中根鍵的界面句柄;
[0032]根據(jù)根鍵的界面句柄,調(diào)用界面函數(shù)從樹(shù)根逐層查找,獲取展開(kāi)鍵的坐標(biāo)。
[0033]可選地,獲取鍵值項(xiàng)坐標(biāo)包括:
[0034]模擬鼠標(biāo)操作,在獲取到的展開(kāi)鍵的坐標(biāo)位置執(zhí)行點(diǎn)擊操作;[0035]查找鍵值項(xiàng)所在界面的界面句柄;
[0036]根據(jù)所述鍵值項(xiàng)所在的界面句柄,從該界面列表中遍歷查找,并獲取所述鍵值項(xiàng)的坐標(biāo)。
[0037]可選地,所述預(yù)定位置包括鍵值項(xiàng)的坐標(biāo)和/或注冊(cè)表編輯器的菜單欄。
[0038]根據(jù)本發(fā)明提供的另一方面,其提供了一種操作注冊(cè)表的裝置,包括:
[0039]啟動(dòng)模塊,其用于啟動(dòng)注冊(cè)表編輯器;
[0040]獲取模塊,其用于獲取所述注冊(cè)表編輯器的窗口句柄;
[0041]操作模塊,其用于根據(jù)所述窗口句柄通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作。
[0042]可選地,所述操作模塊包括:
[0043]菜單項(xiàng)操作模塊,其用于獲取注冊(cè)表編輯器的菜單項(xiàng),模擬鼠標(biāo)和/或鍵盤對(duì)所述菜單項(xiàng)進(jìn)行操作。
[0044]可選地,所述菜單項(xiàng)操作模塊如下獲取注冊(cè)表上的菜單項(xiàng):
[0045]獲取系統(tǒng)所有頂級(jí)窗口句柄列表;
[0046]在預(yù)定位置模擬鼠標(biāo)點(diǎn)擊操作;
[0047]在預(yù)定時(shí)間間隔內(nèi),獲得系統(tǒng)所有頂級(jí)窗口句柄列表;
[0048]比較第一次和第二次分別獲得的所有頂級(jí)窗口句柄列表的差集;
[0049]從所述差集找到彈出菜單的窗口句柄;
[0050]根據(jù)所述菜單的窗口句柄獲得相應(yīng)的菜單項(xiàng)。
[0051 ] 可選地,所述操作模塊包括:
[0052]坐標(biāo)獲取模塊,其用于獲取展開(kāi)鍵坐標(biāo)和/或展開(kāi)鍵值項(xiàng)坐標(biāo),并模擬鼠標(biāo)進(jìn)行操作。
[0053]可選地,所述坐標(biāo)獲取模塊如下獲取展開(kāi)鍵坐標(biāo):
[0054]獲取注冊(cè)表編輯器中根鍵的界面句柄;
[0055]根據(jù)根鍵的界面句柄,調(diào)用界面函數(shù)從樹(shù)根逐層查找,獲取展開(kāi)鍵的坐標(biāo)。
[0056]可選地,坐標(biāo)獲取模塊如下獲取展開(kāi)鍵值項(xiàng)坐標(biāo):
[0057]模擬鼠標(biāo)操作,在獲取到的展開(kāi)鍵的坐標(biāo)位置執(zhí)行點(diǎn)擊操作;
[0058]查找鍵值項(xiàng)所在界面的界面句柄;
[0059]根據(jù)所述鍵值項(xiàng)所在的界面句柄,從該界面列表中遍歷查找,并獲取所述鍵值項(xiàng)的坐標(biāo)。
[0060]可選地,所述預(yù)定位置包括展開(kāi)鍵值項(xiàng)的坐標(biāo)和/或注冊(cè)表編輯器的菜單欄。
[0061]本發(fā)明提出的上述方案適用于任何平臺(tái),其通過(guò)模仿用戶的鼠標(biāo)及鍵盤動(dòng)作,在系統(tǒng)自帶的注冊(cè)表編輯器界面上對(duì)注冊(cè)表進(jìn)行操作。該方案在與各種殺毒軟件或者防護(hù)軟件并存的情況下,能夠?qū)崿F(xiàn)模擬真實(shí)用戶進(jìn)行注冊(cè)表操作的行為,同時(shí)可以忽略平臺(tái)的差異性,適用于各種圖形化操作系統(tǒng)中對(duì)注冊(cè)表進(jìn)行操作的場(chǎng)景。本發(fā)明能夠?qū)崿F(xiàn)操作注冊(cè)表功能的合法性,能夠保證對(duì)注冊(cè)表的進(jìn)行安全操作,同時(shí)也確保了系統(tǒng)安全性。
[0062]上述說(shuō)明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說(shuō)明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的【具體實(shí)施方式】加以說(shuō)明?!緦@綀D】
【附圖說(shuō)明】
[0063]圖1是Windows操作系統(tǒng)利用CPU運(yùn)行級(jí)別的圖形化示意圖;
[0064]圖2是本發(fā)明中操作注冊(cè)表的方法流程圖;
[0065]圖3是在Windows系統(tǒng)下模擬用戶手動(dòng)操作打開(kāi)注冊(cè)表編輯器的其中一種方法流程圖;
[0066]圖4是本發(fā)明中獲取注冊(cè)表編輯器菜單項(xiàng)的方法流程圖;
[0067]圖5是本發(fā)明中新建展開(kāi)鍵的方法流程圖;
[0068]圖6是本發(fā)明中獲取展開(kāi)鍵坐標(biāo)的方法流程圖;
[0069]圖7是本發(fā)明中獲取鍵值項(xiàng)坐標(biāo)的方法流程圖;
[0070]圖8是利用本發(fā)明在Windows系統(tǒng)下在注冊(cè)表編輯器中修改鍵值項(xiàng)的實(shí)施方式流程圖;
[0071]圖9是利用本發(fā)明在Windows系統(tǒng)下獲取注冊(cè)表編輯器中展開(kāi)鍵坐標(biāo)的實(shí)施方式流程圖;
[0072]圖10是利用本發(fā)明在Windows系統(tǒng)下獲取注冊(cè)表編輯器中鍵值項(xiàng)坐標(biāo)的實(shí)施方式流程圖;
[0073]圖11示出了利用本發(fā)明在Windows系統(tǒng)下注冊(cè)表編輯器中修改鍵值項(xiàng)的另一種實(shí)施方式流程圖;
[0074]圖12是本發(fā)明中操作注冊(cè)表的裝置的模塊化結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0075]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,以下結(jié)合具體實(shí)施例,并參照附圖,對(duì)本發(fā)明進(jìn)一步詳細(xì)說(shuō)明。
[0076]圖2示出了本發(fā)明提供的一種操作注冊(cè)表的方法流程圖。如圖2所示,該方法包括:
[0077]步驟201:啟動(dòng)注冊(cè)表編輯器;
[0078]步驟202:獲取所述注冊(cè)表編輯器的窗口句柄;
[0079]步驟203:根據(jù)所述窗口句柄通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作。
[0080]步驟201:啟動(dòng)注冊(cè)表編輯器。
[0081]在Windows系統(tǒng)中,啟動(dòng)注冊(cè)表編輯器的方式可以有多種,如通過(guò)系統(tǒng)提供的API接口模擬用戶手動(dòng)操作打開(kāi)注冊(cè)表編輯器,或者調(diào)用系統(tǒng)提供的API接口直接啟動(dòng)注冊(cè)表編輯器等。
[0082]可選地,如果模擬用戶手動(dòng)操作來(lái)打開(kāi)注冊(cè)表編輯器,可以通過(guò)模擬Win+R的系統(tǒng)熱鍵調(diào)起“運(yùn)行”窗口,并在打開(kāi)路徑中輸入Register, exe,然后模擬用戶鼠標(biāo)點(diǎn)擊該“運(yùn)行”窗口上的“確定”,啟動(dòng)注冊(cè)表編輯器。
[0083]本領(lǐng)域的技術(shù)人員可以理解,本文所稱界面函數(shù)是指系統(tǒng)或開(kāi)發(fā)平臺(tái)提供的對(duì)計(jì)算機(jī)系統(tǒng)的圖形用戶界面進(jìn)行操作的函數(shù)。
[0084]圖3示出了在Windows系統(tǒng)下模擬用戶手動(dòng)操作打開(kāi)注冊(cè)表編輯器的其中一種方法流程圖。如圖3所示,該方法包括:[0085]步驟301:通過(guò)調(diào)用系統(tǒng)API接口 “keybd_event”輸入鍵盤虛擬碼“VK_LWIN+R”調(diào)出“運(yùn)行”窗口 ;
[0086]步驟302:調(diào)用系統(tǒng) API 接口 “FindWindow&EnumChiIdWindows” 查找窗口“ClaSSName=Eidt”的輸入框的句柄“hedit”,即獲得“運(yùn)行”窗口上的輸入框句柄,然后調(diào)用系統(tǒng)API接口 “SendMessage”向此句柄“hedit”發(fā)送消息號(hào)“WM_SETTEXT”,其參數(shù)為“Register, exe”,即模擬手工操作向所述輸入框輸入“Register, exe” ;
[0087]步驟303:調(diào)用系統(tǒng) API 接 P “FindWindow&EnumChildWindows” 查找窗口"WindowsName= ‘確定’ ”的按鈕句柄“hbtn”,即獲得“運(yùn)行”窗口上的確定按鈕句柄,并調(diào)用系統(tǒng)API接口 “PostMessage”向句柄“hbtn”發(fā)送BN_CLICKED消息,即模擬手工點(diǎn)擊確定按鈕,打開(kāi)注冊(cè)表編輯器。
[0088]當(dāng)然上述方式中,也可以通過(guò)快捷鍵等鍵盤模擬方式進(jìn)行操作。另外,每種操作系統(tǒng)中注冊(cè)表編輯器的打開(kāi)路徑不盡相同,可以根據(jù)實(shí)際情況模擬用戶操作來(lái)啟動(dòng)注冊(cè)表編輯器。
[0089]步驟202:獲取所述注冊(cè)表編輯器的窗口句柄。在Windows系統(tǒng)中,每個(gè)打開(kāi)的窗口都具有特定的句柄,通過(guò)獲得該句柄即可對(duì)其進(jìn)行操作。
[0090]依據(jù)上面所舉的例子,通過(guò)模擬用戶手動(dòng)操作打開(kāi)注冊(cè)表編輯器后,可以在一個(gè)超時(shí)時(shí)間5s內(nèi),輪詢調(diào)用系統(tǒng)API接口 “FindWindow”,查找窗口“ClassName=RegisterWindowClass”的句柄,即查找獲得Register, exe注冊(cè)表編輯器的窗口句柄。
[0091]步驟203:根據(jù)所述窗口句柄通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作。具體地,對(duì)注冊(cè)表的操作包括導(dǎo)入或?qū)С鲎?cè)文件,新建、刪除或重命名鍵或鍵值項(xiàng),修改鍵值項(xiàng)等。對(duì)于上述這些對(duì)注冊(cè)表的操作,都可以通過(guò)調(diào)用界面函數(shù)來(lái)實(shí)現(xiàn)。
[0092]可選地,所述通過(guò)調(diào)用界面函數(shù)對(duì)注冊(cè)表進(jìn)行操作包括:獲取注冊(cè)表編輯器的菜單項(xiàng),模擬鼠標(biāo)和/或鍵盤對(duì)所述菜單項(xiàng)進(jìn)行操作。
[0093]圖4示出了本發(fā)明中獲取注冊(cè)表編輯器的菜單項(xiàng)的方法流程圖。如圖4所示,獲取注冊(cè)表編輯器菜單項(xiàng)的方法包括如下步驟:
[0094]步驟401:獲取系統(tǒng)所有頂級(jí)窗口句柄,形成第一窗口句柄列表;
[0095]步驟402:在預(yù)定位置模擬鼠標(biāo)點(diǎn)擊操作;
[0096]步驟403:在預(yù)定時(shí)間間隔內(nèi),再次獲取系統(tǒng)所有頂級(jí)窗口句柄,形成第二窗口句柄列表;
[0097]步驟404:獲取第一窗口句柄列表和第二窗口句柄列表的差集;
[0098]步驟405:從所述差集中獲取菜單的窗口句柄;
[0099]步驟406:根據(jù)所述菜單的窗口句柄獲取菜單項(xiàng)。
[0100]可選地,所述預(yù)定位置包括鍵值項(xiàng)的坐標(biāo)和/或注冊(cè)表編輯器的菜單欄。對(duì)于不同的操作,可以選擇直接在相應(yīng)鍵值項(xiàng)上模擬鼠標(biāo)右鍵選擇對(duì)應(yīng)的菜單進(jìn)行操作,也可以直接在注冊(cè)表編輯器的菜單欄上進(jìn)行操作。例如,對(duì)于導(dǎo)入、導(dǎo)出、新建和重命名操作,可以選擇利用注冊(cè)表編輯器的菜單欄進(jìn)行操作,而其他操作可以選擇在相應(yīng)鍵值項(xiàng)上模擬鼠標(biāo)右鍵選擇對(duì)應(yīng)的菜單進(jìn)行操作,當(dāng)然如導(dǎo)出、新建和重命名等操作兩種方式皆可。
[0101]下面以新建鍵和/或鍵值項(xiàng)為例來(lái)詳細(xì)說(shuō)明獲取注冊(cè)表編輯器中菜單項(xiàng)的具體流程。圖5示出了本發(fā)明中新建展開(kāi)鍵的方法流程圖。如圖5所示,該具體流程包括:
[0102]步驟501:通過(guò)系統(tǒng)API接口 EnumChildWindows獲取系統(tǒng)的所有頂級(jí)窗口句柄列表,記為第一窗口句柄列表hwndlistl ;
[0103]步驟502:在預(yù)定的位置處,通過(guò)操作系統(tǒng)提供的API接口 mouse_event傳遞參數(shù)MOUSEEVENTF_RIGHTDOWN&MOUSEEVENTF_RIGHTUP,以模擬鼠標(biāo)右鍵操作。
[0104]步驟503:在一個(gè)超時(shí)時(shí)間內(nèi)(默認(rèn)5s),循環(huán)調(diào)用系統(tǒng)API接口EnumChildffindows獲得一份系統(tǒng)中當(dāng)前所有的頂級(jí)窗口句柄,記為第二窗口句柄列表hwndlist2 ;
[0105]步驟504:計(jì)算第二窗口句柄列表hwndlist2與第一窗口句柄列表hwndlistl的
差集;
[0106]步驟505:在所述差集中查找ClassName=#32768的句柄,即彈出菜單項(xiàng)的窗口句柄 hwnd ;
[0107]步驟506:通過(guò)系統(tǒng)API接口 GetMenu將所述彈出菜單項(xiàng)的窗口句柄hwnd轉(zhuǎn)換為菜單句柄hmenu ;
[0108]步驟507:根據(jù)所述菜單句柄hmenu調(diào)用系統(tǒng)API接口 GetMenuItemCount獲取此菜單中所有菜單項(xiàng)個(gè)數(shù),并調(diào)用系統(tǒng)API接口 GetMenuItemInfo遍歷每一個(gè)菜單項(xiàng),獲取其文字信息為“新建”的菜單項(xiàng),并返回該菜單項(xiàng)所在的位置坐標(biāo)(x,y),模擬用戶將鼠標(biāo)光標(biāo)放置在該位置坐標(biāo)(X,y),并根據(jù)上面介紹的步驟查找彈出菜單,如此遞歸繼續(xù)查找到文字信息為“項(xiàng)”的菜單項(xiàng)所對(duì)應(yīng)的位置坐標(biāo);
[0109]步驟508:在所找到的“項(xiàng)”菜單項(xiàng)對(duì)應(yīng)的位置坐標(biāo)處,模擬用戶鼠標(biāo)點(diǎn)擊操作,并模擬用戶的鍵盤操作,輸入新建鍵的名稱,并模擬回車操作,完成鍵的新建操作。
[0110]鍵值項(xiàng)的新建操作與上述鍵的新建操作類似,所不同的是最后查找的是文字信息為“字符串值”、“二進(jìn)制值”、“DWORD值”、“多字符串值”或“可擴(kuò)充字符串值”等。
[0111]所述步驟502中預(yù)定的位置可以是注冊(cè)表編輯器窗口中左邊界面上要新建的鍵的父鍵坐標(biāo),也可以是所述父鍵對(duì)應(yīng)的右邊界面上任意位置的坐標(biāo)。
[0112]另外,所述新建操作還可以通過(guò)獲取注冊(cè)表編輯器上的系統(tǒng)菜單來(lái)完成,具體為:獲取注冊(cè)表編輯器的窗口句柄,并根據(jù)所述窗口句柄獲取其菜單句柄,根據(jù)所述菜單句柄找到“編輯”菜單項(xiàng)的位置坐標(biāo)后,模擬將鼠標(biāo)光標(biāo)置于該位置坐標(biāo)處,并查找彈出菜單,如此遞歸繼續(xù)查找到文字信息為“項(xiàng)”的菜單項(xiàng)所對(duì)應(yīng)的位置坐標(biāo),并進(jìn)行相應(yīng)的新建操作。
[0113]可選地,所述通過(guò)調(diào)用界面函數(shù)對(duì)注冊(cè)表進(jìn)行操作還包括:獲取展開(kāi)鍵坐標(biāo)和/或鍵值項(xiàng)坐標(biāo),并模擬鼠標(biāo)進(jìn)行操作。
[0114]圖6示出了本發(fā)明中獲取展開(kāi)鍵坐標(biāo)的方法流程圖。如圖5所示,獲取展開(kāi)鍵坐標(biāo)的方法包括:
[0115]步驟601:獲取注冊(cè)表編輯器中根鍵的界面句柄;
[0116]步驟602:根據(jù)根鍵的界面句柄,調(diào)用界面函數(shù)從樹(shù)根逐層查找,獲取展開(kāi)鍵的坐標(biāo)。
[0117]圖7示出了本發(fā)明中獲取鍵值項(xiàng)坐標(biāo)的方法流程圖。如圖7所示,獲取鍵值項(xiàng)坐標(biāo)的方法包括:
[0118]步驟701:模擬鼠標(biāo)操作,在獲取到的展開(kāi)鍵的坐標(biāo)位置執(zhí)行點(diǎn)擊操作;[0119]步驟702:查找鍵值項(xiàng)所在界面的界面句柄;
[0120]步驟703:根據(jù)所述鍵值項(xiàng)所在的界面句柄,從該界面列表中遍歷查找,并獲取所述鍵值項(xiàng)的坐標(biāo)。
[0121]下面以修改鍵值項(xiàng)為例簡(jiǎn)要說(shuō)明一下注冊(cè)表編輯器的操作流程。
[0122]圖8示出了利用本發(fā)明在Windows系統(tǒng)下在注冊(cè)表編輯器中修改鍵值項(xiàng)的詳細(xì)實(shí)施方式流程圖。如圖8所示,該方法包括:
[0123]步驟801:通過(guò)調(diào)用系統(tǒng)接口運(yùn)行注冊(cè)表編輯器Regedit,并獲取Regedit的界面句柄;
[0124]步驟802:拆分待修改的目標(biāo)鍵值項(xiàng)路徑;比如需要修改鍵HKEY_CURRENT_CONFIG\ Software \ Fonts的鍵值項(xiàng)LogPixels的鍵值內(nèi)容,則第一次則將其拆分成鍵HKEY_CURRENT_CONFIG \ Software \ Fonts 和鍵值項(xiàng) LogPixels ;鍵 HKEY_CURRENT_C0NFIG \Software \ Fonts位于Regedit界面左邊部分的樹(shù)狀結(jié)構(gòu)中,而鍵值項(xiàng)LogPixels則位于Regedit界面右邊部分的列表結(jié)構(gòu)中;
[0125]步驟803:根據(jù)Regedit的窗口句柄,查找Regedit界面左邊部分的根鍵子鍵的窗口句柄;
[0126]步驟804:根據(jù)根鍵子鍵的窗口句柄,調(diào)用GUI函數(shù)從樹(shù)根層層查找,定位子鍵的坐標(biāo)位置,比如最終定位找到HKEY_CURRENT_C0NFIG \ Software \ Fonts中的子鍵Fonts的坐標(biāo)位置;
[0127]步驟805:找到子鍵的坐標(biāo)位置后,模擬鼠標(biāo)操作,點(diǎn)擊定位到的坐標(biāo)位置,使該子鍵對(duì)應(yīng)的鍵值項(xiàng)信息顯示在Regedit界面右部的列表結(jié)構(gòu)中;
[0128]步驟806:獲取Regedit界面右部的根鍵值項(xiàng)的界面句柄,并根據(jù)所述根鍵值項(xiàng)的界面句柄,遍歷所述列表結(jié)構(gòu),最終定位待查找鍵值項(xiàng)的坐標(biāo)位置;
[0129]步驟807:在所找到的鍵值項(xiàng)的坐標(biāo)位置上,模擬鼠標(biāo)右鍵操作,彈出菜單項(xiàng),并從所述菜單項(xiàng)中選擇“修改”菜單項(xiàng)進(jìn)行修改操作。
[0130]下面詳細(xì)說(shuō)明在注冊(cè)表編輯器中獲取展開(kāi)鍵坐標(biāo)和獲取鍵值項(xiàng)坐標(biāo)的方法步驟。
[0131]圖9示出了利用本發(fā)明在Windows系統(tǒng)下獲取注冊(cè)表編輯器中展開(kāi)鍵坐標(biāo)的詳細(xì)實(shí)施方式流程圖。如圖9所示,該方法包括:
[0132]步驟901:通過(guò)系統(tǒng)API接口 FindWindow查找類型SysTreeView32的窗口,獲取注冊(cè)表編輯器中鍵(注冊(cè)表編輯器左邊界面)的窗口句柄hwnd ;
[0133]步驟902:調(diào)用系統(tǒng)API接口 SendMessage向所述鍵窗口句柄hwnd發(fā)送消息號(hào)TVM_GETNEXTITEM,其參數(shù)為“TVGN_R00T”,以獲取注冊(cè)表編輯器中根鍵HKEY_CLASSES_ROOT 的信息 hitem ;
[0134]步驟903:調(diào)用系統(tǒng)API接口 WriteProcessMemory申請(qǐng)一塊內(nèi)存rectAddr,其結(jié)構(gòu)體形式為TVITEM ;
[0135]步驟904:調(diào)用系統(tǒng)API接口 SendMessage向所述鍵窗口句柄hwnd發(fā)送消息號(hào)TVM_GETNEXTITEM,參數(shù)為“ I ”,獲取所述根鍵HKEY_CLASSES_R00T下的第一個(gè)鍵信息item,并保存到內(nèi)存塊rectAddr中,同時(shí)把其父節(jié)點(diǎn)即根鍵HKEY_CLASSES_R00T的信息hitem也保存到內(nèi)存塊rectAddr中;
[0136]步驟905:調(diào)用系統(tǒng)API接口 ReadProcessMemory從內(nèi)存塊rectAddr中讀取所述第一個(gè)鍵信息item,該鍵信息包含text和rect,分別表示文字信息和位置坐標(biāo);
[0137]步驟906:調(diào)用系統(tǒng)API接口 GetWindowRect向所述鍵窗口句柄hwnd發(fā)消息,以獲取該鍵窗口句柄hwnd的位置坐標(biāo)rect ;
[0138]步驟907:根據(jù)所述鍵窗口句柄hwnd對(duì)應(yīng)的位置坐標(biāo)rect和所述第一個(gè)鍵信息item中包含的位置坐標(biāo)rect計(jì)算出該第一個(gè)鍵在所述鍵窗口的相對(duì)坐標(biāo)pos ;
[0139]步驟908:用同樣的方法,循環(huán)查找第一個(gè)鍵item的子鍵childHitem,獲取子鍵childHitem的文字信息和坐標(biāo)位置,匹配其文字信息是否與給定的鍵名相同;
[0140]步驟909:如果相同,則調(diào)用系統(tǒng)API接口 SendMessage給所述鍵窗口句柄hwnd發(fā)消息TVM_EXPAND,參數(shù)為TVE_EXPAND,使該第一個(gè)鍵展開(kāi),并顯示在界面居中位置,調(diào)用系統(tǒng)API接口 SendMessage給所述鍵窗口句柄hwnd發(fā)消息TVM_SELECTITEM,參數(shù)為TVGN_CARET,以選中所述第一個(gè)鍵;
[0141]步驟910:如果不相同,則依次查找與所述第一個(gè)鍵相鄰的下一個(gè)鍵nextitem,并使用同樣的方法,循環(huán)查找下一個(gè)鍵nextitem的子鍵,直到找到給定的鍵,并獲取該給定鍵的坐標(biāo)。
[0142]圖10示出了利用本發(fā)明在Windows系統(tǒng)下獲取注冊(cè)表編輯器中鍵值項(xiàng)坐標(biāo)的詳細(xì)實(shí)施方式流程圖。如圖10所示,該方法包括:
[0143]步驟1001:通過(guò)系統(tǒng)API接口 FindWindow查找類型SysListView32的窗口,獲取鍵值項(xiàng)(注冊(cè)表編輯器右邊界面)的窗口句柄hwnd;
[0144]步驟1002:調(diào)用系統(tǒng)API接口 SendMessage向所述鍵值項(xiàng)窗口句柄hwnd發(fā)送LVM_GETITEMC0UNT的消息號(hào),獲取所述鍵值項(xiàng)窗口句柄hwnd對(duì)應(yīng)的鍵值項(xiàng)數(shù)量count,即鍵值項(xiàng)行數(shù);
[0145]步驟1003:遍歷所述鍵值項(xiàng)窗口中的每行鍵值項(xiàng)對(duì)應(yīng)的信息item,行號(hào)為index,調(diào)用系統(tǒng)API接口 WriteProcessMemory申請(qǐng)一塊內(nèi)存rectAddr,其結(jié)構(gòu)體形式為L(zhǎng)VITEM ;
[0146]步驟1004:調(diào)用系統(tǒng)API接口 SendMessage向所述鍵值項(xiàng)窗口句柄hwnd發(fā)送LVM_GETITEMTEXT的消息號(hào),參數(shù)為當(dāng)前所遍歷的鍵值項(xiàng)行號(hào)index,獲取當(dāng)前遍歷的鍵值項(xiàng)信息item,并保存到內(nèi)存塊rectAddr中;
[0147]步驟1005:調(diào)用系統(tǒng)API接口 ReadProcessMemory從內(nèi)存塊rectAddr中讀取當(dāng)前遍歷的鍵值項(xiàng)信息item,該鍵值項(xiàng)信息item包含文字信息和該鍵值項(xiàng)對(duì)應(yīng)的坐標(biāo),過(guò)匹配該鍵值項(xiàng)信息item包含的文字信息是否與給定的鍵值項(xiàng)名相同;
[0148]步驟1006:如果不相同,則繼續(xù)遍歷查找下一行;
[0149]步驟1007:如果相同,則調(diào)用系統(tǒng)API接口 GetWindowRect向所述鍵值項(xiàng)窗口句柄hwnd發(fā)消息,獲取所述鍵值項(xiàng)窗口的坐標(biāo),根據(jù)所述鍵值項(xiàng)窗口的坐標(biāo)和當(dāng)前遍歷的鍵值項(xiàng)的坐標(biāo)計(jì)算出該當(dāng)前遍歷的鍵值項(xiàng)在鍵值項(xiàng)窗口內(nèi)的相對(duì)坐標(biāo),作為所要獲取的鍵值項(xiàng)的坐標(biāo)。
[0150]圖11示出了利用本發(fā)明在Windows系統(tǒng)下注冊(cè)表編輯器中修改鍵值項(xiàng)的另一種實(shí)施方式流程圖。如圖11所示,該方法包括:
[0151]步驟1101:利用上面方法中已介紹的確定的鍵值項(xiàng)坐標(biāo)pos,通過(guò)系統(tǒng)API接口mouse_event 傳遞 M0USEEVENTF_RIGHTD0WN&M0USEEVENTF_RIGHTUP 參數(shù)模擬鼠標(biāo)右鍵操作;[0152]步驟1102:調(diào)用系統(tǒng) API 接口 FindWindow&EnumChildWindows 查找窗口ClassName= “編輯字符串”的輸入框的句柄hedit,調(diào)用系統(tǒng)API接口 SendMessage向此輸入框句柄hedit發(fā)送WM_SETTEXT的消息號(hào),參數(shù)為要修改的內(nèi)容;
[0153]步驟1103:調(diào)用系統(tǒng) API 接口 FindWindow&EnumChildWindows 查找窗口WindowsName^i‘確定”的按鈕句柄hbtn,調(diào)用系統(tǒng)API接口 PostMessage向該按鈕句柄hbtn發(fā)送BN_CLICKED消息,以完成鍵值項(xiàng)的修改操作。
[0154]本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,上面僅示例性的介紹了本發(fā)明所提出的注冊(cè)表操作方法的一部分【具體實(shí)施方式】,其中僅涵蓋了對(duì)注冊(cè)表的一部分操作方式,而其他對(duì)注冊(cè)表的具體操作都可以沿用上述方法,對(duì)其進(jìn)行擴(kuò)展或變形,只要是通過(guò)調(diào)用界面函數(shù)對(duì)注冊(cè)表進(jìn)行相應(yīng)的操作均涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。
[0155]從上述【具體實(shí)施方式】可以看出,本發(fā)明提出的上述方案中全部流程均調(diào)用界面函數(shù)對(duì)注冊(cè)表進(jìn)行操作,而不是調(diào)用系統(tǒng)提供的注冊(cè)表函數(shù),比如找窗口、輸入文字、點(diǎn)擊按鈕等函數(shù)對(duì)注冊(cè)表進(jìn)行操作。其能夠完美的在防護(hù)軟件監(jiān)控的系統(tǒng)環(huán)境下,實(shí)現(xiàn)對(duì)注冊(cè)表的安全操作,同時(shí)避免了自己的執(zhí)行程序不會(huì)被防護(hù)軟件誤報(bào)導(dǎo)致功能失效等情況,本方法不只限于對(duì)殺毒軟件或者防護(hù)軟件的環(huán)境,同時(shí)也適用于各種Windows正常環(huán)境,能夠保證最大的兼容性。
[0156]需要說(shuō)明的是,對(duì)于方法實(shí)施例,為了簡(jiǎn)單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本申請(qǐng)并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本申請(qǐng),某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說(shuō)明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作和模塊并不一定是本申請(qǐng)所必須的。
[0157]圖12示出了本發(fā)明提出的一種操作注冊(cè)表的裝置的模塊化結(jié)構(gòu)圖。如圖12所示,該裝置包括:
[0158]啟動(dòng)模塊1201,其用于啟動(dòng) 注冊(cè)表編輯器;
[0159]獲取模塊1202,其用于獲取所述注冊(cè)表編輯器的窗口句柄;
[0160]操作模塊1203,其用于根據(jù)所述窗口句柄通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作。
[0161]下面依然以Windows操作系統(tǒng)為例詳細(xì)說(shuō)明本發(fā)明提出的操作注冊(cè)表的裝置所包括的上述各個(gè)模塊實(shí)現(xiàn)的功能,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)知道,該方法不僅限于Windows系統(tǒng),其還適用于能夠通過(guò)注冊(cè)表編輯器對(duì)注冊(cè)表進(jìn)行操作的其它圖形化界面系統(tǒng)。
[0162]啟動(dòng)模塊1201,其用于啟動(dòng)注冊(cè)表編輯器。
[0163]在Windows系統(tǒng)中,啟動(dòng)注冊(cè)表編輯器的方式可以有多種,如通過(guò)系統(tǒng)提供的API接口模擬用戶手動(dòng)操作打開(kāi)注冊(cè)表編輯器,或者調(diào)用系統(tǒng)提供的API接口直接啟動(dòng)注冊(cè)表編輯器等。
[0164]可選地,如果模擬用戶手動(dòng)操作來(lái)打開(kāi)注冊(cè)表編輯器,可以通過(guò)模擬Win+R的系統(tǒng)熱鍵調(diào)起“運(yùn)行”窗口,并在打開(kāi)路徑中輸入Register, exe,然后模擬用戶鼠標(biāo)點(diǎn)擊該“運(yùn)行”窗口上的“確定”,啟動(dòng)注冊(cè)表編輯器。
[0165]啟動(dòng)模塊1201可通過(guò)多種方式來(lái)完成注冊(cè)編輯器的啟動(dòng),其中一種如圖3所示,其可以通過(guò)調(diào)動(dòng)系統(tǒng)接口先調(diào)出“運(yùn)行”窗口,然后調(diào)用系統(tǒng)接口查找獲得“運(yùn)行”窗口上輸入框句柄,并調(diào)用系統(tǒng)接口向所述輸入框句柄輸入注冊(cè)表編輯器的啟動(dòng)程序名稱"Register, exe”,并模擬鼠標(biāo)點(diǎn)擊“運(yùn)行”窗口上的“確定”按鈕,整個(gè)過(guò)程都是調(diào)用界面函數(shù)模擬用戶啟動(dòng)注冊(cè)表的方式啟動(dòng)所述注冊(cè)表編輯器。由于在上面已經(jīng)詳細(xì)介紹了圖3示出的內(nèi)容,在此就不再贅述。
[0166]當(dāng)然上述方式中,也可以通過(guò)快捷鍵等鍵盤模擬方式進(jìn)行操作。另外,每種操作系統(tǒng)中注冊(cè)表編輯器的打開(kāi)路徑不盡相同,可以根據(jù)實(shí)際情況模擬用戶操作來(lái)啟動(dòng)注冊(cè)表編輯器。
[0167]獲取模塊1202,獲取所述注冊(cè)表編輯器的窗口句柄。在Windows系統(tǒng)中,每個(gè)打開(kāi)的窗口都具有特定的句柄,通過(guò)獲得該句柄調(diào)用相應(yīng)的界面函數(shù)即可對(duì)其進(jìn)行操作。
[0168]依據(jù)上面所舉的例子,通過(guò)模擬用戶手動(dòng)操作打開(kāi)注冊(cè)表編輯器后,可以在一個(gè)超時(shí)時(shí)間5s內(nèi),輪詢調(diào)用系統(tǒng)API接口 “FindWindow”,查找窗口“ClassName=RegisterWindowClass”的句柄,即查找獲得Register, exe注冊(cè)表編輯器的窗口句柄。
[0169]操作模塊1203,其根據(jù)所述窗口句柄通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作。具體地,對(duì)注冊(cè)表的操作包括導(dǎo)入或?qū)С鲎?cè)文件,新建、刪除或重命名鍵或鍵值項(xiàng),修改鍵值項(xiàng)等。對(duì)于上述這些對(duì)注冊(cè)表的操作,都可以通過(guò)調(diào)用界面函數(shù)來(lái)實(shí)現(xiàn)。
[0170]可選地,所述操作模塊包括菜單項(xiàng)操作模塊,其用于獲取注冊(cè)表編輯器的菜單項(xiàng),模擬鼠標(biāo)和/或鍵盤對(duì)所述菜單項(xiàng)進(jìn)行操作。
[0171]所述菜單項(xiàng)操作模塊獲取注冊(cè)表編輯器的菜單項(xiàng)具體實(shí)現(xiàn)過(guò)程如下:
[0172]獲取系統(tǒng)所有頂級(jí)窗口句柄,形成第一窗口句柄列表;
[0173]在預(yù)定位置模擬鼠標(biāo)點(diǎn)擊操作;
[0174]在預(yù)定時(shí)間間隔內(nèi),再次獲取系統(tǒng)所有頂級(jí)窗口句柄,形成第二窗口句柄列表;
[0175]獲取第一窗口句柄列表和第二窗口句柄列表的差集;
[0176]從所述差集中獲取菜單的窗口句柄;
[0177]根據(jù)所述菜單的窗口句柄獲取菜單項(xiàng)。
[0178]可選地,所述預(yù)定位置包括鍵值項(xiàng)的坐標(biāo)和/或注冊(cè)表編輯器的菜單欄。對(duì)于不同的操作,可以選擇直接在相應(yīng)鍵值項(xiàng)上模擬鼠標(biāo)右鍵選擇對(duì)應(yīng)的菜單進(jìn)行操作,也可以直接在注冊(cè)表編輯器的菜單欄上進(jìn)行操作。例如,對(duì)于導(dǎo)入、導(dǎo)出、新建和重命名操作,可以選擇利用注冊(cè)表編輯器的菜單欄進(jìn)行操作,而其他操作可以選擇在相應(yīng)鍵值項(xiàng)上模擬鼠標(biāo)右鍵選擇對(duì)應(yīng)的菜單進(jìn)行操作,當(dāng)然如導(dǎo)出、新建和重命名等操作兩種方式皆可。
[0179]下面以新建鍵和/或鍵值項(xiàng)為例來(lái)詳細(xì)說(shuō)明菜單項(xiàng)操作模塊獲取注冊(cè)表編輯器中菜單項(xiàng)的具體流程。
[0180]首先,該模塊通過(guò)系統(tǒng)API接口 EnumChildWindows獲取系統(tǒng)的所有頂級(jí)窗口句柄列表,記為第一窗口句柄列表hwndlistl ;在預(yù)定的位置處,通過(guò)操作系統(tǒng)提供的API接口mouse_event 傳遞參數(shù) MOUSEEVENTF_RIGHTDOWN&MOUSEEVENTF_RIGHTUP,以模擬鼠標(biāo)右鍵操作。
[0181]其次,在一個(gè)超時(shí)時(shí)間內(nèi)(默認(rèn)5s),循環(huán)調(diào)用系統(tǒng)API接口 EnumChildWindows獲得一份系統(tǒng)中當(dāng)前所有的頂級(jí)窗口句柄,記為第二窗口句柄列表hwn d I i s 12 ;計(jì)算第二窗口句柄列表hwndlist2與第一窗口句柄列表hwndlistl的差集;在所述差集中查找ClassName=#32768的句柄,即彈出菜單項(xiàng)的窗口句柄hwnd ;[0182]之后,通過(guò)系統(tǒng)API接口 GetMenu將所述彈出菜單項(xiàng)的窗口句柄hwnd轉(zhuǎn)換為菜單句柄hmenu ;根據(jù)所述菜單句柄hmenu調(diào)用系統(tǒng)API接口 GetMenuItemCount獲取此菜單中所有菜單項(xiàng)個(gè)數(shù),并調(diào)用系統(tǒng)API接口 GetMenuItemInfo遍歷每一個(gè)菜單項(xiàng),獲取其文字信息為“新建”的菜單項(xiàng),并返回該菜單項(xiàng)所在的位置坐標(biāo)(x,y),模擬用戶將鼠標(biāo)光標(biāo)放置在該位置坐標(biāo)U,y),并根據(jù)上面介紹的步驟查找彈出菜單,如此遞歸繼續(xù)查找到文字信息為“項(xiàng)”的菜單項(xiàng)所對(duì)應(yīng)的位置坐標(biāo);
[0183]最后,在所找到的“項(xiàng)”菜單項(xiàng)對(duì)應(yīng)的位置坐標(biāo)處,模擬用戶鼠標(biāo)點(diǎn)擊操作,并模擬用戶的鍵盤操作,輸入新建鍵的名稱,并模擬回車操作,完成鍵的新建操作。
[0184]鍵值項(xiàng)的新建操作與上述鍵的新建操作類似,所不同的是最后查找的是文字信息為“字符串值”、“二進(jìn)制值”、“DWORD值”、“多字符串值”或“可擴(kuò)充字符串值”等。
[0185]上述預(yù)定的位置可以是注冊(cè)表編輯器窗口中左邊界面上要新建的鍵的父鍵坐標(biāo),也可以是所述父鍵對(duì)應(yīng)的右邊界面上任意位置的坐標(biāo)。
[0186]另外,所述新建操作還可以通過(guò)獲取注冊(cè)表編輯器上的系統(tǒng)菜單來(lái)完成,具體為:獲取注冊(cè)表編輯器的窗口句柄,并根據(jù)所述窗口句柄獲取其菜單句柄,根據(jù)所述菜單句柄找到“編輯”菜單項(xiàng)的位置坐標(biāo)后,模擬將鼠標(biāo)光標(biāo)置于該位置坐標(biāo)處,并查找彈出菜單,如此遞歸繼續(xù)查找到文字信息為“項(xiàng)”的菜單項(xiàng)所對(duì)應(yīng)的位置坐標(biāo),并進(jìn)行相應(yīng)的新建操作。
[0187]可選地,所述操作模塊還包括:坐標(biāo)獲取模塊,其用于獲取展開(kāi)鍵坐標(biāo)和/或展開(kāi)鍵值項(xiàng)坐標(biāo),并模擬鼠標(biāo)進(jìn)行操作。
[0188]其中,坐標(biāo)獲取模塊獲取展開(kāi)鍵坐標(biāo)的具體實(shí)現(xiàn)過(guò)程如下:
[0189]首先,獲取注冊(cè)表編輯器中根鍵的界面句柄;
[0190]其次,根據(jù)根鍵的界面句柄,調(diào)用界面函數(shù)從樹(shù)根逐層查找,獲取展開(kāi)鍵的坐標(biāo)。
[0191]其中,所述坐標(biāo)獲取模塊獲取鍵值項(xiàng)坐標(biāo)的具體實(shí)現(xiàn)過(guò)程如下:
[0192]首先,模擬鼠標(biāo)操作,在獲取到的展開(kāi)鍵的坐標(biāo)位置執(zhí)行點(diǎn)擊操作;
[0193]其次,查找鍵值項(xiàng)所在界面的界面句柄;
[0194]最后,根據(jù)所述鍵值項(xiàng)所在的界面句柄,從該界面列表中遍歷查找,并獲取所述鍵值項(xiàng)的坐標(biāo)。
[0195]下面以修改鍵值項(xiàng)為例簡(jiǎn)要說(shuō)明一下該操作注冊(cè)表的裝置對(duì)注冊(cè)表編輯器進(jìn)行操作的具體實(shí)現(xiàn)過(guò)程。
[0196]首先,啟動(dòng)模塊通過(guò)調(diào)用系統(tǒng)接口運(yùn)行注冊(cè)表編輯器Regedit ;
[0197]其次,所述獲取模塊獲取Regedit的界面句柄;
[0198]再次,所述操作模塊拆分待修改的目標(biāo)鍵值項(xiàng)路徑;比如需要修改鍵HKEY_CURRENT_CONFIG \ Software \ Fonts的鍵值項(xiàng)LogPixels的鍵值內(nèi)容,則第一次則將其拆分成鍵 HKEY_CURRENT_CONFIG \ Software \ Fonts 和鍵值項(xiàng) LogPixels ;鍵 HKEY_CURRENT_C0NFIG \ Software \ Fonts位于Regedit界面左邊部分的樹(shù)狀結(jié)構(gòu)中,而鍵值項(xiàng)LogPixels則位于Regedit界面右邊部分的列表結(jié)構(gòu)中;
[0199]之后,操作模塊根據(jù)Regedit的窗口句柄,查找Regedit界面左邊部分的根鍵子鍵的窗口句柄;并根據(jù)根鍵子鍵的窗口句柄,調(diào)用GUI函數(shù)從樹(shù)根層層查找,定位子鍵的坐標(biāo)位置,比如最終定位找到HKEY_CURRENT_C0NFIG \ Software \ Fonts中的子鍵Fonts的坐標(biāo)位置;在找到子鍵的坐標(biāo)位置后,模擬鼠標(biāo)操作,點(diǎn)擊定位到的坐標(biāo)位置,使該子鍵對(duì)應(yīng)的鍵值項(xiàng)信息顯示在Regedit界面右部的列表結(jié)構(gòu)中;
[0200]最后,獲取Regedit界面右部的根鍵值項(xiàng)的界面句柄,并根據(jù)所述根鍵值項(xiàng)的界面句柄,遍歷所述列表結(jié)構(gòu),最終定位待查找鍵值項(xiàng)的坐標(biāo)位置;在所找到的鍵值項(xiàng)的坐標(biāo)位置上,模擬鼠標(biāo)右鍵操作,彈出菜單項(xiàng),并從所述菜單項(xiàng)中選擇“修改”菜單項(xiàng)進(jìn)行修改操作。
[0201]下面詳細(xì)說(shuō)明根據(jù)本發(fā)明提出的操作注冊(cè)表的裝置在注冊(cè)表編輯器中獲取展開(kāi)鍵坐標(biāo)和獲取鍵值項(xiàng)坐標(biāo)的具體實(shí)現(xiàn)過(guò)程。
[0202]獲取注冊(cè)表編輯器中展開(kāi)鍵坐標(biāo)的具體實(shí)現(xiàn)過(guò)程如下:
[0203]首先,操作模塊通過(guò)系統(tǒng)API接口 FindWindow查找類型SysTreeView32的窗口,獲取注冊(cè)表編輯器中鍵(注冊(cè)表編輯器左邊界面)的窗口句柄hwnd;調(diào)用系統(tǒng)API接口 SendMessage向所述鍵窗口句柄hwnd發(fā)送消息號(hào)TVM_GETNEXTITEM,其參數(shù)為“TVGN_ROOT”,以獲取注冊(cè)表編輯器中根鍵HKEY_CLASSES_R00T的信息hitem ;調(diào)用系統(tǒng)API接口WriteProcessMemory申請(qǐng)一塊內(nèi)存rectAddr,其結(jié)構(gòu)體形式為TVITEM ;
[0204]其次,操作模塊調(diào)用系統(tǒng)API接口 SendMessage向所述鍵窗口句柄hwnd發(fā)送消息號(hào)TVM_GETNEXTITEM,參數(shù)為“1”,獲取所述根鍵HKEY_CLASSES_R00T下的第一個(gè)鍵信息item,并保存到內(nèi)存塊rectAddr中,同時(shí)把其父節(jié)點(diǎn)即根鍵HKEY_CLASSES_R00T的信息hitem也保存到內(nèi)存塊rectAddr中;調(diào)用系統(tǒng)API接口 ReadProcessMemory從內(nèi)存塊rectAddr中讀取所述第一個(gè)鍵信息item,該鍵信息包含text和rect,分別表示文字信息和位置坐標(biāo);
[0205]之后,操作模塊調(diào)用系統(tǒng)API接口 GetWindowRect向所述鍵窗口句柄hwnd發(fā)消息,以獲取該鍵窗口句柄hwnd的位置坐標(biāo)rect ;根據(jù)所述鍵窗口句柄hwnd對(duì)應(yīng)的位置坐標(biāo)rect和所述第一個(gè)鍵信息item中包含的位置坐標(biāo)rect計(jì)算出該第一個(gè)鍵在所述鍵窗口的相對(duì)坐標(biāo)pos ;
[0206]最后,操作模塊用同樣的方法,循環(huán)查找第一個(gè)鍵item的子鍵childHitem,獲取子鍵childHitem的文字信息和坐標(biāo)位置,匹配其文字信息是否與給定的鍵名相同;
[0207]如果相同,則調(diào)用系統(tǒng)API接口 SendMessage給所述鍵窗口句柄hwnd發(fā)消息TVM_EXPAND,參數(shù)為TVE_EXPAND,使該第一個(gè)鍵展開(kāi),并顯示在界面居中位置,調(diào)用系統(tǒng)API接口 SendMessage給所述鍵窗口句柄hwnd發(fā)消息TVM_SELECTITEM,參數(shù)為TVGN_CARET,以選中所述第一個(gè)鍵;
[0208]如果不相同,則依次查找與所述第一個(gè)鍵相鄰的下一個(gè)鍵nextitem,并使用同樣的方法,循環(huán)查找下一個(gè)鍵nextitem的子鍵,直到找到給定的鍵,并獲取該給定鍵的坐標(biāo)。
[0209]獲取注冊(cè)表編輯器中鍵值項(xiàng)坐標(biāo)的具體實(shí)現(xiàn)過(guò)程如下:
[0210]首先,操作模塊通過(guò)系統(tǒng)API接口 FindWindow查找類型SysListView32的窗口,獲取鍵值項(xiàng)(注冊(cè)表編輯器右邊界面)的窗口句柄hwnd ;并調(diào)用系統(tǒng)API接口 SendMessage向所述鍵值項(xiàng)窗口句柄hwnd發(fā)送LVM_GETITEMCOUNT的消息號(hào),獲取所述鍵值項(xiàng)窗口句柄hwnd對(duì)應(yīng)的鍵值項(xiàng)數(shù)量count,即鍵值項(xiàng)行數(shù);
[0211]其次,操作模塊遍歷所述鍵值項(xiàng)窗口中的每行鍵值項(xiàng)對(duì)應(yīng)的信息item,行號(hào)為index,調(diào)用系統(tǒng)API接口 WriteProcessMemory申請(qǐng)一塊內(nèi)存rectAddr,其結(jié)構(gòu)體形式為L(zhǎng)VITEM ;調(diào)用系統(tǒng)API接口 SendMessage向所述鍵值項(xiàng)窗口句柄hwnd發(fā)送LVM_GETITEMTEXT的消息號(hào),參數(shù)為當(dāng)前所遍歷的鍵值項(xiàng)行號(hào)index,獲取當(dāng)前遍歷的鍵值項(xiàng)信息item,并保存到內(nèi)存塊rectAddr中;
[0212]最后,操作模塊調(diào)用系統(tǒng)API接口 ReadProcessMemory從內(nèi)存塊rectAddr中讀取當(dāng)前遍歷的鍵值項(xiàng)信息item,該鍵值項(xiàng)信息item包含文字信息和該鍵值項(xiàng)對(duì)應(yīng)的坐標(biāo),過(guò)匹配該鍵值項(xiàng)信息item包含的文字信息是否與給定的鍵值項(xiàng)名相同;
[0213]如果不相同,則繼續(xù)遍歷查找下一行;
[0214]如果相同,則調(diào)用系統(tǒng)API接口 GetWindowRect向所述鍵值項(xiàng)窗口句柄hwnd發(fā)消息,獲取所述鍵值項(xiàng)窗口的坐標(biāo),根據(jù)所述鍵值項(xiàng)窗口的坐標(biāo)和當(dāng)前遍歷的鍵值項(xiàng)的坐標(biāo)計(jì)算出該當(dāng)前遍歷的鍵值項(xiàng)在鍵值項(xiàng)窗口內(nèi)的相對(duì)坐標(biāo),作為所要獲取的鍵值項(xiàng)的坐標(biāo)。
[0215]Windows操作系統(tǒng)下在注冊(cè)表編輯器中修改鍵值項(xiàng)的具體實(shí)現(xiàn)過(guò)程如下:
[0216]首先,利用上面方法中已介紹的確定的鍵值項(xiàng)坐標(biāo)pos,操作模塊通過(guò)系統(tǒng)API接口 mouse_event 傳遞 MOUSEEVENTF_RIGHTDOWN&MOUSEEVENTF_RIGHTUP 參數(shù)模擬鼠標(biāo)右鍵操作;
[0217]其次,操作模塊調(diào)用系統(tǒng)API接口 FindWindow&EnumChi IdWindows查找窗口ClassName= “編輯字符串”的輸入框的句柄hedit,調(diào)用系統(tǒng)API接口 SendMessage向此輸入框句柄hedit發(fā)送WM_SETTEXT的消息號(hào),參數(shù)為要修改的內(nèi)容;
[0218]最后,操作模塊調(diào)用系統(tǒng)API接口 FindWindow&EnumChiIdWindows查找窗口WindowsName^i‘確定”的按鈕句柄hbtn,調(diào)用系統(tǒng)API接口 PostMessage向該按鈕句柄hbtn發(fā)送BN_CLICKED消息,以完成鍵值項(xiàng)的修改操作。
[0219]上面所介紹的具體實(shí)現(xiàn)過(guò)程均是以啟動(dòng)模塊和獲取模塊已經(jīng)啟動(dòng)了注冊(cè)表編輯器并獲得了注冊(cè)表編輯器的窗口句柄為前提,且上面僅示例型的介紹了注冊(cè)表的一部分操作過(guò)程,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)能夠通過(guò)上面介紹的流程毫無(wú)疑義地得出注冊(cè)表的其他操作流程。
[0220]由于所述裝置實(shí)施例基本相應(yīng)于前述圖1所示的方法實(shí)施例,故本實(shí)施例的描述中未詳盡之處,可以參見(jiàn)前述實(shí)施例中的相關(guān)說(shuō)明,在此就不贅述了。
[0221]ell、如權(quán)利要求8所述的操作注冊(cè)表的裝置,其特征在于,所述操作模塊包括:
[0222]坐標(biāo)獲取模塊,其用于獲取展開(kāi)鍵坐標(biāo)和/或展開(kāi)鍵值項(xiàng)坐標(biāo),并模擬鼠標(biāo)進(jìn)行操作。
[0223]cl2、如權(quán)利要求11所述的操作注冊(cè)表的裝置,其特征在于,所述坐標(biāo)獲取模塊如下獲取展開(kāi)鍵坐標(biāo):
[0224]獲取注冊(cè)表編輯器中根鍵的界面句柄;
[0225]根據(jù)根鍵的界面句柄,調(diào)用界面函數(shù)從樹(shù)根逐層查找,獲取展開(kāi)鍵的坐標(biāo)。
[0226]cl3、如權(quán)利要求11或13所述的操作注冊(cè)表的裝置,其特征在于,坐標(biāo)獲取模塊如下獲取展開(kāi)鍵值項(xiàng)坐標(biāo):
[0227]模擬鼠標(biāo)操作,在獲取到的展開(kāi)鍵的坐標(biāo)位置執(zhí)行點(diǎn)擊操作;
[0228]查找鍵值項(xiàng)所在界面的界面句柄;
[0229]根據(jù)所述鍵 值項(xiàng)所在的界面句柄,從該界面列表中遍歷查找,并獲取所述鍵值項(xiàng)的坐標(biāo)。
[0230]cl4、如權(quán)利要求10所述的操作注冊(cè)表的裝置,其特征在于,所述預(yù)定位置包括展開(kāi)鍵值項(xiàng)的坐標(biāo)和/或注冊(cè)表編輯器的菜單欄。
[0231]本發(fā)明提出的上述方案可用于眾多通用或?qū)S玫挠?jì)算系統(tǒng)環(huán)境或配置中。例如:個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、機(jī)頂盒、可編程的消費(fèi)電子設(shè)備、網(wǎng)絡(luò)PC、小型計(jì)算機(jī)、大型計(jì)算機(jī)、包括以上任何系統(tǒng)或設(shè)備的分布式計(jì)算環(huán)境等等。
[0232]本發(fā)明可以在由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計(jì)算環(huán)境中實(shí)踐本申請(qǐng),在這些分布式計(jì)算環(huán)境中,由通過(guò)通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來(lái)執(zhí)行任務(wù)。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲(chǔ)設(shè)備在內(nèi)的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。
[0233]最后,還需要說(shuō)明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語(yǔ)僅僅用來(lái)將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開(kāi)來(lái),而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒(méi)有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、物品或者設(shè)備所固有的要素。在沒(méi)有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過(guò)程、方法、物品或者設(shè)備中還存在另外的相同要素。
[0234]以上所述的具體實(shí)施例,對(duì)本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說(shuō)明,所應(yīng)理解的是,以上所述僅為本發(fā)明的具體實(shí)施例而已,并不用于限制本發(fā)明,凡在本發(fā)明的精神和原則之 內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種操作注冊(cè)表的方法,其特征在于,包括: 啟動(dòng)注冊(cè)表編輯器; 獲取所述注冊(cè)表編輯器的窗口句柄; 根據(jù)所述窗口句柄通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作。
2.如權(quán)利要求1所述的操作注冊(cè)表的方法,其特征在于,所述通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作包括:獲取注冊(cè)表編輯器的菜單項(xiàng),模擬鼠標(biāo)和/或鍵盤對(duì)所述菜單項(xiàng)進(jìn)行操作。
3.如權(quán)利要求2所述的操作注冊(cè)表的方法,其特征在于,獲取注冊(cè)表編輯器的菜單項(xiàng)包括: 獲取系統(tǒng)所有頂級(jí)窗口句柄,形成第一窗口句柄列表; 在預(yù)定位置模擬鼠標(biāo)點(diǎn)擊操作; 在預(yù)定時(shí)間間隔內(nèi),再次獲取系統(tǒng)所有頂級(jí)窗口句柄,形成第二窗口句柄列表; 獲取第一窗口句柄列表和第二窗口句柄列表的差集; 從所述差集中獲取菜單的窗口句柄; 根據(jù)所述菜單的窗口句柄獲取菜單項(xiàng)。
4.如權(quán)利要求1所述的操作注冊(cè)表的方法,其特征在于,所述通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作包括:獲取展開(kāi)鍵坐標(biāo)和/或鍵值項(xiàng)坐標(biāo),并模擬鼠標(biāo)進(jìn)行操作。
5.如權(quán)利要求4所述的操作注冊(cè)表的方法,其特征在于,獲取展開(kāi)鍵坐標(biāo)包括: 獲取注冊(cè)表編輯器中根鍵的界面句柄; 根據(jù)根鍵的界面句柄,調(diào)用界面函數(shù)從樹(shù)根逐層查找,獲取展開(kāi)鍵的坐標(biāo)。
6.如權(quán)利要求4或5所述的操作注冊(cè)表的方法,其特征在于,獲取鍵值項(xiàng)坐標(biāo)包括: 模擬鼠標(biāo)操作,在獲取到的展開(kāi)鍵的坐標(biāo)位置執(zhí)行點(diǎn)擊操作; 查找鍵值項(xiàng)所在界面的界面句柄; 根據(jù)所述鍵值項(xiàng)所在的界面句柄,從該界面列表中遍歷查找,并獲取所述鍵值項(xiàng)的坐標(biāo)。
7.如權(quán)利要求3所述的操作注冊(cè)表的方法,其特征在于,所述預(yù)定位置包括鍵值項(xiàng)的坐標(biāo)和/或注冊(cè)表編輯器的菜單欄。
8.一種操作注冊(cè)表的裝置,其特征在于,包括: 啟動(dòng)模塊,其用于啟動(dòng)注冊(cè)表編輯器; 獲取模塊,其用于獲取所述注冊(cè)表編輯器的窗口句柄; 操作模塊,其用于根據(jù)所述窗口句柄通過(guò)調(diào)用界面函數(shù)對(duì)所述注冊(cè)表編輯器進(jìn)行操作。
9.如權(quán)利要求8所述的操作注冊(cè)表的裝置,其特征在于,所述操作模塊包括: 菜單項(xiàng)操作模塊,其用于獲取注冊(cè)表編輯器的菜單項(xiàng),模擬鼠標(biāo)和/或鍵盤對(duì)所述菜單項(xiàng)進(jìn)行操作。
10.如權(quán)利要求9所述的操作注冊(cè)表的裝置,其特征在于,所述菜單項(xiàng)操作模塊如下獲取注冊(cè)表上的菜單項(xiàng): 獲取系統(tǒng)所有頂級(jí)窗口句柄列表; 在預(yù)定位置模擬鼠標(biāo)點(diǎn)擊操作;在預(yù)定時(shí)間間隔內(nèi),獲得系統(tǒng)所有頂級(jí)窗口句柄列表;比較第一次和第二次分別獲得的所有頂級(jí)窗口句柄列表的差集;從所述差集找到彈出菜單的窗口句柄; 根據(jù)所述菜單的窗口句柄獲得相應(yīng)的菜單項(xiàng)。
【文檔編號(hào)】G06F21/50GK103593186SQ201310556281
【公開(kāi)日】2014年2月19日 申請(qǐng)日期:2013年11月11日 優(yōu)先權(quán)日:2013年11月11日
【發(fā)明者】張 杰, 湯倩 申請(qǐng)人:北京奇虎科技有限公司, 奇智軟件(北京)有限公司