試用版軟體常彈出廣告視窗干擾工作。本文從簡單的「游標指向關閉」演進至「自動遍歷桌面視窗關閉」的完整解決方案。
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 列舉所有頂層視窗,配合回呼函數自動比對標題並關閉。
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 避免關閉隱藏視窗本工具僅供學習 Windows 視窗管理 API 之用。針對合法授權軟體的廣告移除可能違反使用條款。請勿用於破解授權機制或商業用途。開發者應尊重軟體授權協議。