• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 應用實例:VC++實現廣告窗口自動關閉

    發表于:2007-05-26來源:作者:點擊數: 標簽:
    一、 引言 我們在上網瀏覽時,有時訪問到某些網站的網頁時會自動彈出一些廣告窗口,甚至有不少個人主頁為了利用 網絡 廣告來賺錢一下同時彈出幾個甚至十幾個廣告窗口。這些窗口一個一個的關掉十分麻煩,而且如果不關的話又會占用大量的系統資源,所以不少人
    一、 引言

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

      二、 程序設計思路與實現

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

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

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

    clearcase/" target="_blank" >cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    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發行版本等等。本文所述內容有一定的通用性,可以將其用于監視某項進程,當該進程啟動后由程序來觸發某個事件來對其進行處理等等。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>