程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC++編程實現廣告窗口自動關閉

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

編輯:vc教程

一、 引言

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

二、 程序設計思路與實現

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

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

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

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#">[Copy to clipboard]
CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
while (pMainWnd)
{
  ……
  pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT);
}
   對於判斷是否是廣告窗口,可以用GetClassName()函數獲取窗口類型來判斷是否是IE窗口:

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#">[Copy to clipboard]
CString strClassName;
GetClassName(pMainWnd->m_hWnd,strClassName.GetBufferSetLength(100),100); 

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

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#">[Copy to clipboard]
//根據句柄獲取子窗口指針
CWnd* pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"Worker",NULL));
if(!pChildWnd)
  pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"WorkerA",NULL)); 

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

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#">[Copy to clipboard]
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可視效果:


CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#">[Copy to clipboard]
if(pChildNextWnd)
{
  if(!(GetWindowLong(pChildWnd->m_hWnd,GWL_STYLE)&WS_VISIBLE))
  {
   pTempWnd=NULL;
   pTempWnd=pMainWnd;
   //關閉廣告窗口
   ……
   return;
  }

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

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#">[Copy to clipboard]
pTempWnd->PostMessage(WM_CLOSE,0,0); 

三、 小結

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved