應用例項:VC++實現廣告視窗自動關閉(轉)
應用例項: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發行版本等等。本文所述內容有一定的通用性,可以將其用於監視某項程式,當該程式啟動後由程式來觸發某個事件來對其進行處理等等。
我們在上網瀏覽時,有時訪問到某些網站的網頁時會自動彈出一些廣告視窗,甚至有不少個人主頁為了利用網路廣告來賺錢一下同時彈出幾個甚至十幾個廣告視窗。這些視窗一個一個的關掉十分麻煩,而且如果不關的話又會佔用大量的系統資源,所以不少人對此深惡痛絕,作為程式設計師可以利用自身技術優勢根據自己的實際需要編制一些很適合自己的小工具。因此本文就對如何透過軟體程式設計來實現對廣告視窗的自動關閉進行介紹,以期能起到拋磚引玉之效。
二、 程式設計思路與實現
首先要分析一下廣告視窗的一般特性。廣告視窗一般是透過主頁面裡的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Javascript自動關閉視窗(轉)JavaScript
- 用VC++實現不規則視窗 (轉)C++
- javascript關閉當前視窗例項程式碼JavaScript
- 關閉瀏覽器視窗彈出警告視窗程式碼例項瀏覽器
- js微信視窗關閉事件簡單程式碼例項JS事件
- 如何關閉 Windows 7 視窗自動排列功能?Windows
- 關閉瀏覽器視窗彈出提示程式碼例項瀏覽器
- 右下角緩慢出現廣告視窗例項程式碼
- Winform MessageBox訊息彈窗如何實現自動關閉ORM
- 用VC++實現自繪按鈕控制 (轉)
- ajax應用實現iframe高度自適應程式碼例項
- 彈出視窗螢幕(screen)實現關閉右上角的關閉按鈕事件(轉)事件
- 2 Day DBA-管理Oracle例項-關於例項的啟動和關閉-關於例項關閉Oracle
- 自動感知窗體的關閉事件事件
- js關閉視窗JS
- 利用VC++程式設計實現程式自動啟動 (轉)C++程式設計
- Excel函式應用例項:自動錄入性別(轉)Excel函式
- Oracle11g RAC在例項關閉後自動在啟動例項上歸檔Oracle
- 2 Day DBA-管理Oracle例項-關閉和啟動Oracle例項-使用OEMDC關閉和啟動Oracle例項Oracle
- 如何實現在指定的時間後關閉視窗
- sweetalert載入彈窗完成自動關閉
- 在VB中使用API關閉視窗 (轉)API
- Win10系統怎麼關閉視窗自動貼靠 win10關閉自動貼靠的方法Win10
- <轉>“您檢視的網頁正在試圖關閉視窗。是否關閉此視窗”的遮蔽方法(JavaScript)網頁JavaScript
- 2 Day DBA-管理Oracle例項-關於例項的啟動和關閉-關於例項啟動Oracle
- ASM CRS 例項啟動和關閉ASM
- Oracle例項的啟動和關閉Oracle
- js實現彈出灰色背景能夠拖動的視窗例項程式碼JS
- 客戶端showModalDialog的視窗,提交後自動關閉:使用RegisterClientScriptBlock客戶端clientBloC
- Excel函式應用例項:自動錄入出生日期(轉)Excel函式
- VB中實現窗體自動隱藏 (轉)
- C# winForm 視窗跳轉後關閉上一個視窗的方法C#ORM
- js window.open()實現列印,如何在關閉列印視窗時重新整理父視窗JS
- rac 正常關閉例項service不會自動漂移,只有在例項異常abort才會發生自動failoverAI
- 怎樣實現關閉connection時自動關閉Statement和ResultSet
- oracle 例項啟動和關閉解讀Oracle
- Oracle單例項+ASM啟動與關閉Oracle單例ASM
- js如何在子視窗中關閉父視窗JS