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

廣告視窗自動關閉工具:EnumWindows 遍歷桌面視窗實現無干擾過濾

     編輯:關於VC++

問題背景

試用版軟體常彈出廣告視窗干擾工作。本文從簡單的「游標指向關閉」演進至「自動遍歷桌面視窗關閉」的完整解決方案。

演進過程

第一版:游標定位法 (需人工干預)


CPoint pt; GetCursorPos(&pt);
HWND hWnd = WindowFromPoint(pt);
char title[256];
SendMessage(hWnd, WM_GETTEXT, 255, (LPARAM)title);
if (strcmp(title, "MyWindow") == 0)
    PostMessage(hWnd, WM_CLOSE, 0, 0);
缺點:使用者必須將滑鼠移至目標視窗,無法自動化。

第二版:EnumWindows 全自動遍歷法

使用 EnumWindows 列舉所有頂層視窗,配合回呼函數自動比對標題並關閉。

核心 API


BOOL EnumWindows(
    WNDENUMPROC lpEnumFunc,  // 回呼函數
    LPARAM lParam            // 使用者資料
);

BOOL CALLBACK EnumWindowsProc(
    HWND hwnd,      // 視窗控制代碼
    LPARAM lParam   // 傳遞的參數
);

完整實現


// 目標視窗標題清單 (可擴充為設定檔讀取)
const char* TARGET_TITLES[] = { "AdWindow", "TrialReminder", "Sponsor" };
const int TARGET_COUNT = 3;

BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam) {
    char title[256];
    if (GetWindowTextA(hwnd, title, 255) > 0) {
        for (int i = 0; i < TARGET_COUNT; i++) {
            if (strcmp(title, TARGET_TITLES[i]) == 0) {
                PostMessage(hwnd, WM_CLOSE, 0, 0);
                break; // 找到即關閉,繼續列舉其他視窗
            }
        }
    }
    return TRUE; // 繼續列舉
}

void CAntiAdDlg::OnTimer(UINT nIDEvent) {
    if (nIDEvent == TIMER_CHECK_AD) {
        EnumWindows(EnumProc, 0);
    }
    CDialog::OnTimer(nIDEvent);
}

// 初始化:設定 2 秒檢查一次
SetTimer(TIMER_CHECK_AD, 2000, NULL);

進階優化

  • 類別名稱比對:結合 GetClassName 提高準確度,避免誤關同標題的正常視窗
  • 進程過濾:使用 GetWindowThreadProcessId 取得 PID,僅針對特定進程
  • 可見性檢查:IsWindowVisible 避免關閉隱藏視窗
  • 白名單機制:保護重要視窗不被誤殺
  • 設定檔驅動:標題/類別名稱從 INI/Registry 讀取,免重新編譯

範例專案結構

  • 基於 Dialog 的 MFC 專案
  • Timer 控制項觸發週期性掃描
  • 系統托盤常駐,提供啟用/停用/設定/退出選單
  • 日誌記錄被關閉視窗資訊供審計

道德與法律提醒

本工具僅供學習 Windows 視窗管理 API 之用。針對合法授權軟體的廣告移除可能違反使用條款。請勿用於破解授權機制或商業用途。開發者應尊重軟體授權協議。

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