首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 實作廣告視窗自動偵測關閉工具

     編輯:關於VC++

針對瀏覽網頁時彈出的大量廣告視窗(本質為無選單、工具列的 IE 視窗),本文實作一個定時掃描桌面視窗、自動識別並關閉廣告視窗的常駐工具。核心邏輯:列舉頂層視窗 → 篩選 IEFrame 類別 → 檢查子視窗結構與可見狀態 → 送出 WM_CLOSE 關閉。

廣告視窗特徵分析

  • 由 JavaScript/VBScript 動態彈出,類別名為 IEFrame。
  • 通常無選單列、工具列、狀態列等 Chrome 元素。
  • 子視窗結構包含 "Worker" 或 "WorkerA" 類別的子視窗。
  • 內容區域子視窗不可見(WS_VISIBLE 風格未設定)時,判定為廣告視窗。

核心演算法流程

  1. 於初始化函數呼叫 SetTimer 啟動定時器(如每 500ms)。
  2. 定時器觸發時,呼叫 AfxGetMainWnd()->GetWindow(GW_HWNDFIRST) 取得第一個頂層視窗,迴圈呼叫 GetWindow(GW_HWNDNEXT) 遍歷所有頂層視窗。
  3. 對每個視窗呼叫 GetClassName 取得類別名,比對是否為 "IEFrame"。
  4. 若是 IE 視窗,呼叫 FindWindowEx 尋找 "Worker" / "WorkerA" 子視窗,再尋找其同層下一個子視窗(內容區)。
  5. 呼叫 GetWindowLong(hwnd, GWL_STYLE) 檢查內容區子視窗是否具備 WS_VISIBLE 風格。若無,判定為廣告視窗。
  6. 將該視窗指標暫存,呼叫 PostMessage(WM_CLOSE, 0, 0) 關閉。

關鍵代碼片段

// 列舉頂層視窗
CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
while (pMainWnd)
{
    CString strClassName;
    GetClassName(pMainWnd->m_hWnd, strClassName.GetBufferSetLength(100), 100);
    strClassName.ReleaseBuffer();

    if (strClassName == _T("IEFrame"))
    {
        // 尋找 Worker / WorkerA 子視窗
        CWnd* pChildWnd = CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd, NULL, _T("Worker"), NULL));
        if (!pChildWnd)
            pChildWnd = CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd, NULL, _T("WorkerA"), NULL));

        if (pChildWnd)
        {
            // 尋找內容區同層下一個子視窗
            CWnd* pChildNextWnd = CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd, pChildWnd->m_hWnd, _T("Worker"), NULL));
            if (!pChildNextWnd)
                pChildNextWnd = CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd, pChildWnd->m_hWnd, _T("WorkerA"), NULL));

            if (pChildNextWnd)
            {
                // 檢查是否可見
                if (!(GetWindowLong(pChildWnd->m_hWnd, GWL_STYLE) & WS_VISIBLE))
                {
                    CWnd* pTempWnd = pMainWnd;
                    pTempWnd->PostMessage(WM_CLOSE, 0, 0); // 關閉廣告視窗
                    return;
                }
            }
        }
    }
    pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT);
}

工程化建議

  • 系統匣圖示模式:隱藏主視窗,常駐通知區,減少螢幕佔用。
  • Release 版本優化:精簡程式碼,去除調試資訊,控制記憶體佔用。
  • 白名單機制:針對聊天室等易誤判場景,提供排除清單或暫停監控熱鍵。
  • 通用化擴充:相同架構可應用於監控特定進程啟動、自動關閉違規視窗、自動化測試前置清理等場景。

已知限制與改進方向

判斷邏輯基於視窗結構啟發式規則,極少數正常 IE 視窗(如某些全螢幕網頁應用)可能被誤關。可引入視窗標題關鍵字比對、網址檢查(透過 IWebBrowser2 介面)等二次驗證機制提高準確度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved