VC++編程完成廣告窗口自動(dòng)關(guān)閉
發(fā)表時(shí)間:2024-02-19 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]摘要:本文對(duì)自動(dòng)關(guān)閉網(wǎng)絡(luò)廣告窗口的軟件實(shí)現(xiàn)原理及具體實(shí)現(xiàn)過程作了介紹。 關(guān)鍵字:廣告窗口、自動(dòng)關(guān)閉、Visual C++ 6.0 一、 引言 我們?cè)谏暇W(wǎng)瀏覽時(shí),有時(shí)訪問到某些網(wǎng)站的網(wǎng)頁(yè)時(shí)會(huì)自動(dòng)彈出一些廣告窗口,甚至有不少個(gè)人主頁(yè)為了利用網(wǎng)絡(luò)廣告來(lái)賺錢一下同時(shí)彈出幾個(gè)甚至十幾個(gè)廣告窗口。這些...
摘要:本文對(duì)自動(dòng)關(guān)閉網(wǎng)絡(luò)廣告窗口的軟件實(shí)現(xiàn)原理及具體實(shí)現(xiàn)過程作了介紹。
關(guān)鍵字:廣告窗口、自動(dòng)關(guān)閉、Visual C++ 6.0
一、 引言
我們?cè)谏暇W(wǎng)瀏覽時(shí),有時(shí)訪問到某些網(wǎng)站的網(wǎng)頁(yè)時(shí)會(huì)自動(dòng)彈出一些廣告窗口,甚至有不少個(gè)人主頁(yè)為了利用網(wǎng)絡(luò)廣告來(lái)賺錢一下同時(shí)彈出幾個(gè)甚至十幾個(gè)廣告窗口。這些窗口一個(gè)一個(gè)的關(guān)掉十分麻煩,而且如果不關(guān)的話又會(huì)占用大量的系統(tǒng)資源,所以不少人對(duì)此深惡痛絕,作為程序員可以利用自身技術(shù)優(yōu)勢(shì)根據(jù)自己的實(shí)際需要編制一些很適合自己的小工具。因此本文就對(duì)如何通過軟件編程來(lái)實(shí)現(xiàn)對(duì)廣告窗口的自動(dòng)關(guān)閉進(jìn)行介紹,以期能起到拋磚引玉之效。
二、 程序設(shè)計(jì)思路與實(shí)現(xiàn)
首先要分析一下廣告窗口的一般特性。廣告窗口一般是通過主頁(yè)面里的Javascript腳本或VBScript 腳本語(yǔ)言來(lái)動(dòng)態(tài)彈出的,其實(shí)質(zhì)還是一個(gè)IE窗口。但絕大多數(shù)窗口在創(chuàng)建出來(lái)后是沒有菜單,工具條等其它東西的,因此我們可以先搜尋IE窗口,然后判斷其窗口是否有菜單和工具條等東西,如果沒有就認(rèn)為是廣告窗口了,雖然這樣的判斷不是十分的嚴(yán)格,但從實(shí)際使用情況來(lái)看雖然有時(shí)會(huì)誤關(guān)一些正常窗口,但發(fā)生的幾率是相當(dāng)小的。完全可以忽略。而且這種情況多發(fā)生在聊天室中,所以只需在聊天之前將其關(guān)閉,只在瀏覽網(wǎng)頁(yè)的時(shí)候運(yùn)行程序就一般不會(huì)發(fā)生誤操作了。
程序的實(shí)現(xiàn)并不復(fù)雜,由于程序運(yùn)行起來(lái)后任意時(shí)刻彈出的廣告窗體都要隨時(shí)關(guān)閉,所以就應(yīng)當(dāng)通過設(shè)置定時(shí)器,每隔一段時(shí)間就搜尋以下當(dāng)前是否有廣告窗口,如果有就將其關(guān)閉,否則繼續(xù)監(jiān)視。因此可以在程序的初始化入口函數(shù)中用SetTimer()函數(shù)啟動(dòng)定時(shí)器。下面就結(jié)合實(shí)際代碼對(duì)部分關(guān)鍵代碼進(jìn)行講解:
從第一個(gè)窗口開始對(duì)每一個(gè)窗口進(jìn)行枚舉搜索,如果第一個(gè)窗口存在那么就可以通過在while循環(huán)里的GetWindow(GW_HWNDNEXT);來(lái)搜尋下一個(gè)窗口,并在其內(nèi)判斷是否是廣告窗體,直至搜尋完最后一個(gè)窗體為止:
CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
while (pMainWnd)
{
……
pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT);
}
對(duì)于判斷是否是廣告窗口,可以用GetClassName()函數(shù)獲取窗口類型來(lái)判斷是否是IE窗口:
CString strClassName;
GetClassName(pMainWnd->m_hWnd,strClassName.GetBufferSetLength(100),100);
對(duì)于那些不是IE類型的窗體根本不用加以考慮,可以將剛才得到的strClassName窗口類型同"IEFrame"進(jìn)行比較來(lái)進(jìn)行判斷,如果是IE窗口才可以進(jìn)行下一步的判斷:
//根據(jù)句柄獲取子窗口指針
CWnd* pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"Worker",NULL));
if(!pChildWnd)
pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"WorkerA",NULL));
如果子窗口存在,用類似的方法獲取下一個(gè)子窗口指針:
CWnd* pChildNextWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,pChildWnd->m_hWnd,"Worker",NULL));
if(!pChildNextWnd)
pChildNextWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,pChildWnd->m_hWnd,"WorkerA",NULL));
如果該窗口存在,那么下步只要驗(yàn)證當(dāng)前窗口可視就可以斷定其的確屬于廣告窗口,可以通過GetWindowLong()獲取到當(dāng)前的窗口風(fēng)格,然后通過邏輯運(yùn)算可以判斷出當(dāng)前窗口是否具有WS_VISIBLE可視效果:
if(pChildNextWnd)
{
if(!(GetWindowLong(pChildWnd->m_hWnd,GWL_STYLE)&WS_VISIBLE))
{
pTempWnd=NULL;
pTempWnd=pMainWnd;
//關(guān)閉廣告窗口
……
return;
}
}
現(xiàn)在已經(jīng)可以準(zhǔn)確判斷出哪個(gè)是廣告窗口了,只需將其關(guān)閉即可,前段代碼已經(jīng)將我們想關(guān)閉的窗口指針保存到變量pTempWnd中,因此我們可以通過簡(jiǎn)單的向其發(fā)送WM_CLOSE消息就可以徹底將其關(guān)閉了:
pTempWnd->PostMessage(WM_CLOSE,0,0);
三、 小結(jié)
本文僅對(duì)于關(guān)閉廣告窗口的核心代碼作了介紹,在實(shí)際編程中需要考慮到許多實(shí)際的因素,比如為了節(jié)省屏幕占用空間,最好將其做成系統(tǒng)托盤模式;由于需要長(zhǎng)期駐留內(nèi)存所以要盡量把程序大小控制好,并且采用Release發(fā)行版本等等。本文所述內(nèi)容有一定的通用性,可以將其用于監(jiān)視某項(xiàng)進(jìn)程,當(dāng)該進(jìn)程啟動(dòng)后由程序來(lái)觸發(fā)某個(gè)事件來(lái)對(duì)其進(jìn)行處理等等。