當前位置:編程學習大全網 - 源碼下載 - VC++實現廣告窗口自動關閉

VC++實現廣告窗口自動關閉

壹、 引言

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

二、 程序設計思路與實現

首先要分析壹下廣告窗口的壹般特性。廣告窗口壹般是通過主頁面裏的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發行版本等等。本文所述內容有壹定的通用性,可以將其用於監視某項進程,當該進程啟動後由程序來觸發某個事件來對其進行處理等等。

  • 上一篇:如何使用hexo構建github
  • 下一篇:別人送的花束想做成幹花。應該怎麽做?
  • copyright 2024編程學習大全網