明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

VC++編程完成廣告窗口自動關閉

[摘要]摘要:本文對自動關閉網(wǎng)絡廣告窗口的軟件實現(xiàn)原理及具體實現(xiàn)過程作了介紹! £P鍵字:廣告窗口、自動關閉、Visual C++ 6.0   一、 引言  我們在上網(wǎng)瀏覽時,有時訪問到某些網(wǎng)站的網(wǎng)頁時會自動彈出一些廣告窗口,甚至有不少個人主頁為了利用網(wǎng)絡廣告來賺錢一下同時彈出幾個甚至十幾個廣告窗口。這些...
摘要:本文對自動關閉網(wǎng)絡廣告窗口的軟件實現(xiàn)原理及具體實現(xiàn)過程作了介紹。

  關鍵字:廣告窗口、自動關閉、Visual C++ 6.0

  一、 引言

  我們在上網(wǎng)瀏覽時,有時訪問到某些網(wǎng)站的網(wǎng)頁時會自動彈出一些廣告窗口,甚至有不少個人主頁為了利用網(wǎng)絡廣告來賺錢一下同時彈出幾個甚至十幾個廣告窗口。這些窗口一個一個的關掉十分麻煩,而且如果不關的話又會占用大量的系統(tǒng)資源,所以不少人對此深惡痛絕,作為程序員可以利用自身技術優(yōu)勢根據(jù)自己的實際需要編制一些很適合自己的小工具。因此本文就對如何通過軟件編程來實現(xiàn)對廣告窗口的自動關閉進行介紹,以期能起到拋磚引玉之效。

  二、 程序設計思路與實現(xiàn)

  首先要分析一下廣告窗口的一般特性。廣告窗口一般是通過主頁面里的Javascript腳本或VBScript 腳本語言來動態(tài)彈出的,其實質(zhì)還是一個IE窗口。但絕大多數(shù)窗口在創(chuàng)建出來后是沒有菜單,工具條等其它東西的,因此我們可以先搜尋IE窗口,然后判斷其窗口是否有菜單和工具條等東西,如果沒有就認為是廣告窗口了,雖然這樣的判斷不是十分的嚴格,但從實際使用情況來看雖然有時會誤關一些正常窗口,但發(fā)生的幾率是相當小的。完全可以忽略。而且這種情況多發(fā)生在聊天室中,所以只需在聊天之前將其關閉,只在瀏覽網(wǎng)頁的時候運行程序就一般不會發(fā)生誤操作了。

  程序的實現(xiàn)并不復雜,由于程序運行起來后任意時刻彈出的廣告窗體都要隨時關閉,所以就應當通過設置定時器,每隔一段時間就搜尋以下當前是否有廣告窗口,如果有就將其關閉,否則繼續(xù)監(jiān)視。因此可以在程序的初始化入口函數(shù)中用SetTimer()函數(shù)啟動定時器。下面就結合實際代碼對部分關鍵代碼進行講解:

  從第一個窗口開始對每一個窗口進行枚舉搜索,如果第一個窗口存在那么就可以通過在while循環(huán)里的GetWindow(GW_HWNDNEXT);來搜尋下一個窗口,并在其內(nèi)判斷是否是廣告窗體,直至搜尋完最后一個窗體為止:

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

  對于判斷是否是廣告窗口,可以用GetClassName()函數(shù)獲取窗口類型來判斷是否是IE窗口:

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

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

//根據(jù)句柄獲取子窗口指針
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;
 }
}

  現(xiàn)在已經(jīng)可以準確判斷出哪個是廣告窗口了,只需將其關閉即可,前段代碼已經(jīng)將我們想關閉的窗口指針保存到變量pTempWnd中,因此我們可以通過簡單的向其發(fā)送WM_CLOSE消息就可以徹底將其關閉了:

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

  三、 小結

  本文僅對于關閉廣告窗口的核心代碼作了介紹,在實際編程中需要考慮到許多實際的因素,比如為了節(jié)省屏幕占用空間,最好將其做成系統(tǒng)托盤模式;由于需要長期駐留內(nèi)存所以要盡量把程序大小控制好,并且采用Release發(fā)行版本等等。本文所述內(nèi)容有一定的通用性,可以將其用于監(jiān)視某項進程,當該進程啟動后由程序來觸發(fā)某個事件來對其進行處理等等。