欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法及其設(shè)備的制作方法

文檔序號(hào):7747626閱讀:1328來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法及其設(shè)備的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及互聯(lián)網(wǎng)技術(shù),尤其涉及即時(shí)通信軟件。
背景技術(shù)
近來(lái),通過(guò)即時(shí)通信軟件(如QQ、MSN、Skype)的聊天行為導(dǎo)致的泄密事件日益增 多,因此需要在某些場(chǎng)合對(duì)即時(shí)通信軟件的聊天內(nèi)容進(jìn)行監(jiān)控。但是主流的即時(shí)通信軟件 都對(duì)通信內(nèi)容進(jìn)行了加密,若通過(guò)對(duì)網(wǎng)絡(luò)層數(shù)據(jù)包解密的方式獲取聊天內(nèi)容則需要算法密 鑰,而算法密鑰的獲取又非常困難,因此需要尋找新的技術(shù)方法。對(duì)于即時(shí)通信軟件,用戶在使用它們進(jìn)行聊天過(guò)程中,都會(huì)將聊天信息顯示在聊 天窗口上。同時(shí)如QQ2009、MSN、Skype等主流即時(shí)通信軟件都使用“無(wú)窗口類(lèi)型的RichEdit 控件”來(lái)顯示聊天內(nèi)容信息。RichEdit控件是一個(gè)可用于輸入、編輯、格式化、打印和保存文本的窗體。這些文 本可以設(shè)置字符和段落格式,并且可以包含嵌入的COM對(duì)象。由于RichEdit能顯示豐富多 樣的文本、圖片,所以大多數(shù)即時(shí)聊天軟件,如QQ、MSN等都使用RichEdit控件來(lái)作為聊天 內(nèi)容的顯示窗口。無(wú)窗口類(lèi)型的RichEdit控件使用RichEdit模塊提供的COM接口來(lái)創(chuàng)建對(duì)象實(shí) 例,并通過(guò)這些COM接口來(lái)訪問(wèn)其屬性和方法,此時(shí)RichEdit控件不是一個(gè)子窗口,也沒(méi)有 句柄,所以無(wú)法直接通過(guò)Windows系統(tǒng)的消息機(jī)制進(jìn)行訪問(wèn)。

發(fā)明內(nèi)容
本發(fā)明提供了一種能解決以上問(wèn)題的獲取無(wú)窗口 RichEdit控件文本內(nèi)容的方法 及其設(shè)備。在第一方面,本發(fā)明提供了一種獲取無(wú)窗口 RichEdit控件文本內(nèi)容的方法。該方 法包括步驟a,安裝消息鉤子,以便監(jiān)控窗口事件。步驟b,在監(jiān)控窗口事件過(guò)程中,修改該聊天軟件中RichEdit模塊的創(chuàng)建文本服 務(wù)對(duì)象函數(shù)的入口地址,使其跳轉(zhuǎn)到用于獲取文本服務(wù)對(duì)象接口指針的H00K函數(shù)中。步驟c,調(diào)用該H00K函數(shù),以獲取所述文本服務(wù)對(duì)象的接口指針。步驟d,根據(jù)所述文本服務(wù)對(duì)象的接口指針訪問(wèn)RichEdit控件,從而獲得所述無(wú) 窗口 RichEdit控件文本內(nèi)容。在第二方面,本發(fā)明提供了一種獲取無(wú)窗口 RichEdit控件文本內(nèi)容的設(shè)備。該設(shè) 備包括安裝消息鉤子,以便監(jiān)控窗口事件的模塊。在監(jiān)控窗口事件過(guò)程中,修改聊天軟件中RichEdit模塊的創(chuàng)建文本服務(wù)對(duì)象函 數(shù)的入口地址,使其跳轉(zhuǎn)到用于獲取文本服務(wù)對(duì)象接口指針的H00K函數(shù)中的模塊。調(diào)用該H00K函數(shù),以獲取所述文本服務(wù)對(duì)象接口指針的模塊。
4
根據(jù)該文本服務(wù)對(duì)象接口訪問(wèn)RichEdit控件以獲得該無(wú)窗口 RichEdit控件文本 內(nèi)容的模塊。在本發(fā)明的一個(gè)實(shí)施例中,該獲取無(wú)窗口 RichEdit控件文本內(nèi)容的方法包括步驟h,系統(tǒng)強(qiáng)制加載DLL模塊。步驟e,檢測(cè)目標(biāo)進(jìn)程中是否已經(jīng)加載DLL模塊。步驟f,如果尚未加載DLL模塊則系統(tǒng)強(qiáng)制加載DLL模塊,再執(zhí)行步驟g,如果已經(jīng) 加載了 DLL模塊則直接執(zhí)行步驟g。步驟g,檢測(cè)目標(biāo)進(jìn)程是否屬于感興趣進(jìn)程,如果不是感興趣進(jìn)程則將該加載的 DLL模塊退出,如果是感興趣進(jìn)程則繼續(xù)執(zhí)行所述步驟b。
在本發(fā)明的另一個(gè)實(shí)施例中,所述Ri chEd i t控件處理的消息包括用于獲取該 RichEdit控件文本行數(shù)的EM_GETLINECOUNT消息,用于得到行開(kāi)頭字符索引值的EM_ LINEINDEX消息,用于得到行長(zhǎng)度的EM_LINELENGTH消息,用于獲取指定范圍文本內(nèi)容的 EM_GETTEXTRANGE 消息。在本發(fā)明的又一個(gè)實(shí)施例中,所述安裝消息鉤子包括安裝CBT消息鉤子、安裝鼠 標(biāo)消息鉤子和安裝鍵盤(pán)消息鉤子,從而實(shí)時(shí)監(jiān)控窗口事件。本發(fā)明通過(guò)API HOOK技術(shù)獲取“無(wú)窗口類(lèi)型RichEdit控件”的訪問(wèn)接口,進(jìn)而獲 取即時(shí)聊天軟件顯示的聊天內(nèi)容,從而實(shí)現(xiàn)了對(duì)即時(shí)聊天軟件聊天信息的監(jiān)控。本發(fā)明方 法解決了需要通過(guò)算法密鑰對(duì)網(wǎng)絡(luò)層數(shù)據(jù)包的協(xié)議解析來(lái)實(shí)現(xiàn)對(duì)聊天信息進(jìn)行監(jiān)控的技 術(shù)難題。


下面將參照附圖對(duì)本發(fā)明的具體實(shí)施方案進(jìn)行更詳細(xì)的說(shuō)明,在附圖中圖1是本發(fā)明一個(gè)實(shí)施例的基于API HOOK技術(shù)跨進(jìn)程獲取聊天內(nèi)容的流程圖。
具體實(shí)施例方式APKApplication Programming Interface,應(yīng)用程序編程接口)是一預(yù)先定義的 函數(shù),目的是提供給開(kāi)發(fā)人員應(yīng)用程序,使其無(wú)需訪問(wèn)源碼或理解內(nèi)部工作機(jī)制。Η00Κ是Windows中提供的一種用以替換DOS下“中斷”的系統(tǒng)機(jī)制,中文譯為“掛 鉤”或“鉤子”。在對(duì)特定的系統(tǒng)事件進(jìn)行Η00Κ后,一旦發(fā)生已Η00Κ事件,則對(duì)該事件進(jìn)行 Η00Κ的程序就會(huì)受到系統(tǒng)的通知,這時(shí)程序就能在第一時(shí)間對(duì)該事件做出響應(yīng)。API Η00Κ 技術(shù)是一種用于改變API執(zhí)行結(jié)果的技術(shù)。以下將詳細(xì)闡述如何通過(guò)API Η00Κ技術(shù)獲取 無(wú)窗口 RichEdit控件文本內(nèi)容。圖1是本發(fā)明一個(gè)實(shí)施例的基于API Η00Κ技術(shù)跨進(jìn)程獲取聊天內(nèi)容的流程圖。在步驟110,在本地計(jì)算機(jī)中安裝消息鉤子,以便監(jiān)控該本地計(jì)算機(jī)的窗口事件, 如監(jiān)控窗口的創(chuàng)建、移動(dòng)、銷(xiāo)毀、改變大小等。一個(gè)例子中,該消息鉤子為CBT消息鉤子。較 佳地,該消息鉤子為鼠標(biāo)鉤子、鍵盤(pán)鉤子和CBT消息鉤子。在本發(fā)明的一個(gè)實(shí)施例中,安裝CBT消息鉤子的代碼為H安裝CBT鉤子if (glhCbtHook = = NULL)
{glhCbtHook = SetffindowsHookEx(WH_CBT, CbtProc, glhlnstance,0);if (glhCbtHook){MyOutputDebugString(" Setup CBT Hook Success !〃 );}else{char szErr[64] = {0};iErrCode = GetLastError ();sprintf (szErr, “ Setup CBT Hook Failed ! -% d" , iErrCode);MyOutputDebugString (szErr);bHook = FALSE ;}}return bHook ;}在步驟120,系統(tǒng)(如windows操作系統(tǒng))檢測(cè)進(jìn)程中是否已經(jīng)加載了 DLL模塊,
如果已經(jīng)加載了 DLL模塊,則執(zhí)行步驟130 ;如果尚未加載DLL模塊,則執(zhí)行步驟121。在步驟121,系統(tǒng)強(qiáng)制加載DLL模塊,而后執(zhí)行步驟130。在步驟130,由于步驟110已經(jīng)安裝了消息鉤子,因此在監(jiān)控窗口事件過(guò)程中,檢 測(cè)當(dāng)前目標(biāo)進(jìn)程是否屬于感興趣的進(jìn)程(舉例如,打開(kāi)word窗口不是感興趣進(jìn)程,打開(kāi)MSN 聊天窗口是感興趣進(jìn)程),如果不是感興趣進(jìn)程則執(zhí)行步驟131,如果是感興趣進(jìn)程則執(zhí)行 步驟140。在步驟131,將注入的DLL模塊退出。在步驟140,進(jìn)行HOOK API操作,將即時(shí)通信軟件中RichEdit模塊的創(chuàng)建文本服 務(wù)對(duì)象函數(shù)的入口地址頭幾個(gè)字節(jié)的內(nèi)容,修改為跳轉(zhuǎn)到H00K函數(shù)地址的指令。在本發(fā)明的一個(gè)實(shí)施例中,步驟140為,將RichEd20.dll模塊 的CreateTextServices函數(shù)入口地址頭幾個(gè)字節(jié)的內(nèi)容,修改為跳轉(zhuǎn)到 CreateTextServices_H00K 函數(shù)地址的指令。在本發(fā)明的一個(gè)實(shí)施例中,HOOP API處理過(guò)程代碼為BYTE g_btNewBytes[8] = {0xB8,0x0,0x0,0x40,0x0,OxFF,0xE0,0x0};BOOL SetupAPIHookO{HMODULE hModule = NULL ;hModule = GetModuleHandle(" RICHED20.DLL");if (hModule){//獲取API地址
IpCreateTxServProcAddr = (DWORD)GetProcAddress(hModule,〃 CreateTex tServices");if(IpCreateTxServProcAddr = = NULL){MyOutputDebugString (〃 獲取 CreateTextServices 函數(shù)地址失敗!‘‘);return FALSE ;}Il保存原始字節(jié)數(shù)據(jù)if (ReadProcessMemory (INVALID,HANDLE_VALUE, (VOID*) IpCreateTxServProcAddr,(void*)g_dw01dBytes
,sizeof (DWORD)*2,NULL) == FALSE){MyOutputDebugString(〃讀取本地進(jìn)程內(nèi)存數(shù)據(jù)失??!“);return FALSE ;}//將00400000改寫(xiě)為Η00Κ函數(shù)的地址*(DWORD*)(g_btNewBytes+l) = (DWORD)CreateTextServices_Hook ;H改寫(xiě)API入口地址后面幾個(gè)字節(jié)的內(nèi)容if(WriteProcessMemory(INVALID_HANDLE_VALUE,(VOID*)IpCreateTxServProcAddr,(void*)g_btNewBytes,sizeof (DWORD) *2,NULL) = = FALSE){MyOutputDebugString(〃改寫(xiě)本地進(jìn)程內(nèi)存數(shù)據(jù)失?。 ?;return FALSE ;}}return TRUE ;}在步驟150,若即時(shí)通信軟件中的目標(biāo)進(jìn)程調(diào)用創(chuàng)建文本服務(wù)對(duì)象函數(shù),則跳轉(zhuǎn)到 Η00Κ函數(shù)中,以便獲取文本服務(wù)對(duì)象的接口指針。在本發(fā)明的一個(gè)實(shí)施例中,步驟150為,在目標(biāo)進(jìn)程調(diào)用CreateTextServices函 數(shù)時(shí),跳轉(zhuǎn)到CreateTextServices_H00K函數(shù)中,以便獲取ITextServices接口指針。下面以創(chuàng)建文本服務(wù)對(duì)象函數(shù)為CreateTextServices函數(shù),文本服務(wù)對(duì)象接口 指針為ITextServices接口指針,Η00Κ函數(shù)為CreateTextServices_H00K函數(shù)為例,闡述 該Η00Κ函數(shù)的功能。該的Η00Κ函數(shù)功能為,先恢復(fù)CreateTextServices函數(shù)入口地址的頭幾個(gè)字節(jié) 數(shù)據(jù),以便調(diào)用CreateTextServices函數(shù)。然后根據(jù)該CreateTextServices函數(shù)的傳入?yún)?數(shù) IUnknown*punk0uter、ITextHost*pITextHost 獲取指向 IUnknown 對(duì)象指針的指針(該CreateTextServices 函數(shù)的傳出參數(shù) IUnknown氺氺ppUnk),并i亥 CreateTextSercices 的 返回值作為CreateTextServices_HOOK函數(shù)的返回值。再通過(guò)該指向IUnknown對(duì)象指針的 指針查詢(xún)ITextServices接口指針,在獲得該ITextServices接口指針后,將該接口指針保 存起來(lái),以便用于將來(lái)訪問(wèn)RichEdit控件。然后再繼續(xù)將CreateTextServices函數(shù)入口 地址的頭幾個(gè)字節(jié)內(nèi)容改寫(xiě)成跳轉(zhuǎn)到CreateTextServices_HOOK函數(shù)入口地址的指令,以 保證下一次CreateTextServices函數(shù)被調(diào)用時(shí),先進(jìn)入CreateTextServices_HOOK函數(shù)。 最后CreateTextServices_HOOK函數(shù)返回,返回值為內(nèi)部調(diào)用CreateTextServices函數(shù)的 返回值。在本發(fā)明的一個(gè)實(shí)施例中,CreateTextServices_HOOK函數(shù)的代碼為HRESULT WINAPI CreateTextServices_Hook (IUnknown*punkOuter, ITextHost^pITextHost, IUnknown氺氺ppUnk){int i = O ;char szInfo[64] = {0};ITextServices氺IpTxServ = NULL ;//進(jìn)入臨界區(qū)EnterCriticalSection(&csHookApi);//恢復(fù)API頭8個(gè)字節(jié)if (WriteProcessMemory (INVALID_HANDLE_VALUE, (VOID*) IpCreateTxServProcAddr, (void*)g_dw01dBytes
, sizeof(DWORD)NULL)== FALSE){MyOutputDebugString (〃 恢復(fù) API 頭 8 個(gè)字節(jié)失敗〃);}//執(zhí)行真實(shí)的APIHRESULT hResult = CreateTextServices (punkOuter, pITextHost, ppUnk);if (hRe suit== S_0K){//獲取 ITextServices 接 口指針((IUnknown*)(*ppUnk))- > QueryInterface(IID_ITextServices, (void**)(&IpTxServ));if (IpTxServ){//保存接口指針}else{MyOutputDebugString(〃 獲取IID_ITextServices 接口失?。 ?;}[Ol24]}
//繼續(xù)HOOK[Ol26]i f(Wr i t e P r o c e s s M e mo r Y(工NVA L工D HAND LE VA LUE,(V 0工D*)工pCreateTXSerVPr。CAddr, (void*)g_btNewBytes,sizeof(DWORD)*2,NULL) 一一FALSE)[Ol 27]{
My。utputDebugString(”改寫(xiě)本地進(jìn)程內(nèi)存數(shù)據(jù)失敗!”);[Ol29]}
LeaveCriticalSection(&csHookApi)[Ol32]return hResult;[Ol33] 在步驟160,根據(jù)文本服務(wù)對(duì)象接口提供的方法來(lái)訪問(wèn)RichEdit控件,以獲取RichEdit控件的文本內(nèi)容,從而得到聊天內(nèi)容。一個(gè)例子中,根據(jù)I/extServices接口提供的方法來(lái)訪問(wèn)RichEdit控件。[Ol 34] 在本發(fā)明的一個(gè)實(shí)施例中,在RichEdit控件接收并處理的消息中包括EM—GETLINECOUNT消息、EM—LINEINDEX消息、EM—LINELENGTH消息、EM—GETTEXTRANGE消息,其用于獲取RichEdit控件文本內(nèi)容。
EM—GETLINECOUNT消息用于獲取RichEdit控件文本的行數(shù),EM—LINEINDEX消息用于得到行開(kāi)頭字符的索引值,EM—LINELENGTH消息用于得到行長(zhǎng)度,EM—GETTEXTRANGE消息用于獲取指定范圍的文本內(nèi)容。
具體獲取RichEdit控件文本內(nèi)容的處理方法為先獲取RichEdit控件當(dāng)前的文本行數(shù),再與原記錄的行數(shù)進(jìn)行比較,如果沒(méi)有變化則不進(jìn)行任何處理;如果當(dāng)前行數(shù)大于原行數(shù),則以原行數(shù)作為循環(huán)起點(diǎn),新行數(shù)作為循環(huán)結(jié)束點(diǎn),開(kāi)始循環(huán)。在循環(huán)體中,以當(dāng)前行數(shù)值作為索引,先獲取當(dāng)前行首字符的偏移值并將其作為區(qū)段起始值,然后獲取當(dāng)前行的長(zhǎng)度,并將其作為區(qū)段結(jié)束值。然后獲取當(dāng)前行設(shè)定的區(qū)段文本內(nèi)容,并進(jìn)行處理。再繼續(xù)獲取下一行的內(nèi)容,直到所有新增行的內(nèi)容都獲取完為止。[Ol37] 在本發(fā)明的一個(gè)實(shí)施例中,獲取RichEdit控件文本內(nèi)容的代碼為[Ol38]VOID GetReC。dePr。C(IN/iTalkwind。W工ndeX)[Ol39] {
IN/iLine一0
] IN/iLineCount一0
IN/iCharNum一0[Ol43]IN/iLineLength一0[Ol44]LRESUL/IResult一0[Ol45]/EX/1L4NGE/extRange;[Ol46] CHARszMsg/emp[MAXL工NEBUFLENGTH*2+1]一{0};[Ol47]WCHARwszMsg/emp[MAXL工NEBUFLENGTH+1]一{0};[Ol48]//獲取RichEdit控件當(dāng)前行數(shù)
hResult 一 ((I/extServices*)Talkwind。W工nf。[iTalkwind。W工ndeX].pITeXtSerViCe)一>TXSendMeSSage(EM—GETLINECOUNT,0,0,&iLineCount);
if (hResult ! = S_0K)return ;
H判斷是否大于已獲取的行數(shù)if (iLineCount > TalkffindowInfo[iTalkffindowIndex]. iPos){// 初始化 TextRange 結(jié)構(gòu)memset(&TextRange,0, sizeof(TEXTRANGE));TextRange. IpstrText = (char*)wszMsgTemp ;//保存新行數(shù)iLine = TalkWindowInfo[iTalkWindowIndex]. iPos ;TalkWindowInfo[iTalkWindowIndex]. iPos = iLineCount ;Il循環(huán)獲取新增的行內(nèi)容for ( ;iLine < = iLineCount ; iLine++){//初始化內(nèi)容緩沖memset(szMsgTemp,0,sizeof (CHAR)*MAXLINEBUFLENGTH*2);memset(wszMsgTemp,O, sizeof (WCHAR)*MAXLINEBUFLENGTH);//獲取行內(nèi)容//取得行開(kāi)頭字符的索引,作為選擇起始點(diǎn)。((ITextServices氺)TalkffindowInfo[iTalkWindowIndex]. pITextService)- > TxSendMessage (EM_LINEINDEX, iLine, O, &(TextRifflge· chrg. cpMin));//得到行的長(zhǎng)度,作為選擇結(jié)尾偏移量((ITextServices氺)TalkffindowInfo[iTalkWindowIndex]. pITextService)- > TxSendMessage(EM_LINELENGTH, TextRange. chrg. cpMin,O, &iLineLength);iLineLength = iLineLength > MAXLINEBUFLENGTH ? MAXLINEBUFLENGTH iLineLength ;TextRange. chrg. cpMax = TextRange. chrg. cpMin+iLineLength ;//獲取選擇的內(nèi)容((ITextServices氺)TalkffindowInfo[iTalkWindowIndex]. pITextService)- > TxSendMessage(EM_GETTEXTRANGE, O, (LPARAM)&TextRange,&iCharNum);//有實(shí)際內(nèi)容才進(jìn)行處理if (iCharNum > 0){//處理消息內(nèi)容ProcMsgContentBuf ();}} //for}//if}
需要說(shuō)明的是,以上僅以windows系統(tǒng)為例,闡述如何通過(guò)HOOK API方式獲取 無(wú)窗口 RichEdit控件文本內(nèi)容,進(jìn)而獲得即時(shí)通信軟件中的聊天內(nèi)容。實(shí)際上,本發(fā)明 不限于以上所述windows環(huán)境,更不限于H00K以上所述函數(shù),也就是說(shuō),不管系統(tǒng)環(huán)境如 何變化,無(wú)論函數(shù)名稱(chēng)如何改變,只要是通過(guò)安裝消息鉤子及HOOK API方式獲取無(wú)窗口 RichEdit控件文本內(nèi)容,就都在本發(fā)明保護(hù)范圍之內(nèi)。顯而易見(jiàn),在不偏離本發(fā)明的真實(shí)精神和范圍的前提下,在此描述的本發(fā)明可以 有許多變化。因此,所有對(duì)于本領(lǐng)域技術(shù)人員來(lái)說(shuō)顯而易見(jiàn)的改變,都應(yīng)包括在本權(quán)利要求 書(shū)所涵蓋的范圍之內(nèi)。本發(fā)明所要求保護(hù)的范圍僅由所述的權(quán)利要求書(shū)進(jìn)行限定。
權(quán)利要求
一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法,其特征在于,包括步驟a,安裝消息鉤子,以便監(jiān)控窗口事件;步驟b,在監(jiān)控窗口事件過(guò)程中,修改該聊天軟件中RichEdit模塊的創(chuàng)建文本服務(wù)對(duì)象函數(shù)的入口地址,使其跳轉(zhuǎn)到用于獲取文本服務(wù)對(duì)象接口指針的HOOK函數(shù)中;步驟c,調(diào)用該HOOK函數(shù),以獲取所述文本服務(wù)對(duì)象的接口指針;步驟d,根據(jù)所述文本服務(wù)對(duì)象的接口指針訪問(wèn)RichEdit控件,從而獲得所述無(wú)窗口RichEdit控件文本內(nèi)容。
2.如權(quán)利要求1所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法,其特征在于, 在所述步驟a之后,步驟b之前包括步驟h,系統(tǒng)強(qiáng)制加載DLL模塊;步驟e,檢測(cè)目標(biāo)進(jìn)程中是否已經(jīng)加載DLL模塊;步驟f,如果尚未加載DLL模塊則系統(tǒng)強(qiáng)制加載DLL模塊,再執(zhí)行步驟g ;如果已經(jīng)加載 了 DLL模塊則直接執(zhí)行步驟g;步驟g,檢測(cè)目標(biāo)進(jìn)程是否屬于感興趣進(jìn)程,如果不是感興趣進(jìn)程則將該加載的DLL模 塊退出,如果是感興趣進(jìn)程則繼續(xù)執(zhí)行所述步驟b。
3.如權(quán)利要求1所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法,其特征在于, 所述創(chuàng)建文本服務(wù)對(duì)象的函數(shù)為CreateTextServices函數(shù),所述文本服務(wù)對(duì)象的接口指 針為ITextServices接口指針。
4.如權(quán)利要求3所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法,其特征在于, 所述H00K函數(shù)功能為先恢復(fù)所述CreateTextServices函數(shù)入口地址,以便調(diào)用該CreateTextServices函數(shù);然后通過(guò)調(diào)用該CreateTextServices函數(shù)得到所述ITextServices的接口指針; 再將CreateTextServices函數(shù)入口地址改寫(xiě)成跳轉(zhuǎn)到該H00K函數(shù)入口地址的指令; 最后將該H00K函數(shù)返回,其返回值為內(nèi)部調(diào)用CreateTextServices函數(shù)的返回值。
5.如權(quán)利要求4所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法,其特征在于, 所述H00K函數(shù)包括傳入?yún)?shù)IUnknown*punkOuter、ITextHost*pITextHost,以及傳出參數(shù) IUnknown**ppUnk ;該H00K函數(shù)通過(guò)該輸入?yún)?shù)得到該輸出參數(shù),并通過(guò)該傳出參數(shù)得到所述 ITextServices 接口指針。
6.如權(quán)利要求1所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法,其特征在于, 所述RichEdit控件處理的消息包括以下消息中的一個(gè)或多個(gè)用于獲取該RichEdit控件文本行數(shù)的EM_GETLINECOUNT消息; 用于得到行開(kāi)頭字符索引值的EM_LINEINDEX消息; 用于得到行長(zhǎng)度的EM_LINELENGTH消息;以及 用于獲取指定范圍文本內(nèi)容的EM_GETTEXTRANGE消息。
7.如權(quán)利要求6所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法,其特征在于, 所述步驟d包括獲取所述RichEdit控件當(dāng)前的文本行數(shù),并與原記錄的行數(shù)進(jìn)行比較,如果沒(méi)有變化則不進(jìn)行任何處理;如果當(dāng)前行數(shù)大于原行數(shù),則以原行數(shù)作為循環(huán)起點(diǎn),新行數(shù)作為循環(huán)結(jié)束點(diǎn),開(kāi)始循環(huán);在該循環(huán)體中,以當(dāng)前行數(shù)值作為索引,先獲取當(dāng)前行首字符的偏移值,并將其作為區(qū) 段起始值,然后獲取當(dāng)前行的長(zhǎng)度,并將其作為區(qū)段結(jié)束值,再獲取當(dāng)前行設(shè)定的區(qū)段文本 內(nèi)容,并進(jìn)行處理;繼續(xù)獲取下一行內(nèi)容,直到所有新增行的內(nèi)容都獲取完為止。
8.如權(quán)利要求1所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法,其特征在于, 所述安裝消息鉤子包括安裝CBT消息鉤子、安裝鼠標(biāo)消息鉤子和安裝鍵盤(pán)消息鉤子,從而 實(shí)時(shí)監(jiān)控窗口事件。
9.一種獲取無(wú)窗口 RichEdit控件文本內(nèi)容的設(shè)備,其特征在于,包括 安裝消息鉤子,以便監(jiān)控窗口事件的模塊;在監(jiān)控窗口事件過(guò)程中,修改聊天軟件中RichEdit模塊的創(chuàng)建文本服務(wù)對(duì)象函數(shù)的 入口地址,使其跳轉(zhuǎn)到用于獲取文本服務(wù)對(duì)象接口指針的H00K函數(shù)中的模塊; 調(diào)用該H00K函數(shù),以獲取所述文本服務(wù)對(duì)象接口指針的模塊;以及 根據(jù)該文本服務(wù)對(duì)象的接口指針訪問(wèn)RichEdit控件獲得所述無(wú)窗口 RichEdit控件文 本內(nèi)容的模塊。
10.如權(quán)利要求9所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的設(shè)備,其特征在于, 所述創(chuàng)建文本服務(wù)對(duì)象的函數(shù)為CreateTextServices函數(shù),所述文本服務(wù)對(duì)象的接口指 針為ITextServices接口指針。
11.如權(quán)利要求10所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的設(shè)備,其特征在 于,所H00K函數(shù)功能為恢復(fù)所述CreateTextServices函數(shù)入口地址以調(diào)用CreateTextServices函數(shù)的模塊;通過(guò)調(diào)用該CreateTextServices函數(shù)得到所述ITextServices接口指針的模塊; 將CreateTextServices函數(shù)入口地址改寫(xiě)成跳轉(zhuǎn)到該H00K函數(shù)入口地址指令的模 塊;以及將該H00K函數(shù)返回,并將其返回值作為內(nèi)部調(diào)用CreateTextServices函數(shù)返回值的 模塊。
12.如權(quán)利要求9所述的一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的設(shè)備,其特征在于, 所述RichEdit控件處理的消息包括以下消息中的一個(gè)或多個(gè)用于獲取該RichEdit控件文本行數(shù)的EM_GETLINECOUNT消息; 用于得到行開(kāi)頭字符索引值的EM_LINEINDEX消息; 用于得到行長(zhǎng)度的EM_LINELENGTH消息;以及 用于獲取指定范圍文本內(nèi)容的EM_GETTEXTRANGE消息。
全文摘要
本發(fā)明涉及一種獲取無(wú)窗口RichEdit控件文本內(nèi)容的方法及其設(shè)備。本發(fā)明首先安裝消息鉤子,以便監(jiān)控窗口事件。在監(jiān)控窗口事件過(guò)程中,修改該聊天軟件中RichEdit模塊的創(chuàng)建文本服務(wù)對(duì)象函數(shù)的入口地址。然后調(diào)用該HOOK函數(shù),以獲取該文本服務(wù)對(duì)象的接口指針。最后根據(jù)該文本服務(wù)對(duì)象接口訪問(wèn)RichEdit控件。本發(fā)明解決了需要通過(guò)算法密鑰對(duì)網(wǎng)絡(luò)層協(xié)議解析,以實(shí)現(xiàn)對(duì)聊天信息進(jìn)行監(jiān)控而帶來(lái)的技術(shù)難題。因此本發(fā)明方法能夠應(yīng)用于監(jiān)控使用即時(shí)聊天軟件的聊天內(nèi)容。
文檔編號(hào)H04L12/58GK101834807SQ20101016127
公開(kāi)日2010年9月15日 申請(qǐng)日期2010年4月28日 優(yōu)先權(quán)日2010年4月28日
發(fā)明者李繼明 申請(qǐng)人:北京網(wǎng)康科技有限公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
丽江市| 文水县| 宜阳县| 陆川县| 荥阳市| 垫江县| 定安县| 无极县| 哈巴河县| 洞头县| 甘德县| 泊头市| 施甸县| 乡城县| 乌审旗| 鸡泽县| 益阳市| 吉木乃县| 临颍县| 浦北县| 彭山县| 红河县| 尼玛县| 石城县| 道孚县| 陈巴尔虎旗| 新邵县| 芜湖市| 托里县| 南皮县| 海晏县| 建宁县| 广宁县| 山东省| 万州区| 肥城市| 巴马| 年辖:市辖区| 曲阜市| 平江县| 鹿泉市|