應用例項:VC++實現廣告視窗自動關閉(轉)

ba發表於2007-08-15
應用例項:VC++實現廣告視窗自動關閉(轉)[@more@]一、 引言

  我們在上網瀏覽時,有時訪問到某些網站的網頁時會自動彈出一些廣告視窗,甚至有不少個人主頁為了利用網路廣告來賺錢一下同時彈出幾個甚至十幾個廣告視窗。這些視窗一個一個的關掉十分麻煩,而且如果不關的話又會佔用大量的系統資源,所以不少人對此深惡痛絕,作為程式設計師可以利用自身技術優勢根據自己的實際需要編制一些很適合自己的小工具。因此本文就對如何透過軟體程式設計來實現對廣告視窗的自動關閉進行介紹,以期能起到拋磚引玉之效。

  二、 程式設計思路與實現

  首先要分析一下廣告視窗的一般特性。廣告視窗一般是透過主頁面裡的Javascript指令碼或VBScript 指令碼語言來動態彈出的,其實質還是一個IE視窗。但絕大多數視窗在建立出來後是沒有選單,工具條等其它東西的,因此我們可以先搜尋IE視窗,然後判斷其視窗是否有選單和工具條等東西,如果沒有就認為是廣告視窗了,雖然這樣的判斷不是十分的嚴格,但從實際使用情況來看雖然有時會誤關一些正常視窗,但發生的機率是相當小的。完全可以忽略。而且這種情況多發生在聊天室中,所以只需在聊天之前將其關閉,只在瀏覽網頁的時候執行程式就一般不會發生誤操作了。

  程式的實現並不複雜,由於程式執行起來後任意時刻彈出的廣告窗體都要隨時關閉,所以就應當透過設定定時器,每隔一段時間就搜尋以下當前是否有廣告視窗,如果有就將其關閉,否則繼續監視。因此可以在程式的初始化入口函式中用SetTimer()函式啟動定時器。下面就結合實際程式碼對部分關鍵程式碼進行講解:

  從第一個視窗開始對每一個視窗進行列舉搜尋,如果第一個視窗存在那麼就可以透過在while迴圈裡的GetWindow(GW_HWNDNEXT);來搜尋下一個視窗,並在其內判斷是否是廣告窗體,直至搜尋完最後一個窗體為止:

CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
while (pMainWnd)
{
 ……
 pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT);
}

  對於判斷是否是廣告視窗,可以用GetClassName()函式獲取視窗型別來判斷是否是IE視窗:

CString strClassName;
GetClassName(pMainWnd->m_hWnd,strClassName.GetBufferSetLength(100),100);

對於那些不是IE型別的窗體根本不用加以考慮,可以將剛才得到的strClassName視窗型別同"IEFrame"進行比較來進行判斷,如果是IE視窗才可以進行下一步的判斷:

//根據控制程式碼獲取子視窗指標
CWnd* pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"Worker",NULL));
if(!pChildWnd)
 pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"WorkerA",NULL));

  如果子視窗存在,用類似的方法獲取下一個子視窗指標:

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));

  如果該視窗存在,那麼下步只要驗證當前視窗可視就可以斷定其的確屬於廣告視窗,可以透過GetWindowLong()獲取到當前的視窗風格,然後透過邏輯運算可以判斷出當前視窗是否具有WS_VISIBLE可視效果:

if(pChildNextWnd)
{
 if(!(GetWindowLong(pChildWnd->m_hWnd,GWL_STYLE)&WS_VISIBLE))
 {
  pTempWnd=NULL;
  pTempWnd=pMainWnd;
  //關閉廣告視窗
  ……
  return;
 }
}

  現在已經可以準確判斷出哪個是廣告視窗了,只需將其關閉即可,前段程式碼已經將我們想關閉的視窗指標儲存到變數pTempWnd中,因此我們可以透過簡單的向其傳送WM_CLOSE訊息就可以徹底將其關閉了:

pTempWnd->PostMessage(WM_CLOSE,0,0);

  三、 小結

  本文僅對於關閉廣告視窗的核心程式碼作了介紹,在實際程式設計中需要考慮到許多實際的因素,比如為了節省螢幕佔用空間,最好將其做成系統托盤模式;由於需要長期駐留記憶體所以要儘量把程式大小控制好,並且採用Release發行版本等等。本文所述內容有一定的通用性,可以將其用於監視某項程式,當該程式啟動後由程式來觸發某個事件來對其進行處理等等。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-957336/,如需轉載,請註明出處,否則將追究法律責任。

相關文章