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

VC++ 透過視窗標題關閉指定程式:EnumWindows 實作教學

     編輯:VC 教學

前言

惡意程式常透過列舉視窗標題來關閉防毒軟體。其核心機制極簡單——僅需十幾行程式碼。本文示範如何使用 EnumWindows 列舉所有頂層視窗,比對標題關鍵字,並發送 WM_CLOSE 訊息關閉目標視窗。

核心原理

  1. 呼叫 EnumWindows 遍歷所有頂層視窗。
  2. 回呼函式 EnumWindowsProc 中,用 GetWindowText 取得視窗標題。
  3. 以 strstr 或 CString::Find 判斷標題是否包含目標關鍵字(如「記事本」)。
  4. 符合條件則發送 WM_CLOSE 訊息請求關閉。

完整範例程式碼 (Win32 SDK 風格)

#include <windows.h>
#include <string.h>

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    char wtitle[512];
    GetWindowTextA(hwnd, wtitle, sizeof(wtitle));

    // 目標關鍵字:此處為「記事本」
    if (strstr(wtitle, "記事本") != NULL) {
        // 發送關閉訊息,讓程式自行處理存檔提示等邏輯
        SendMessage(hwnd, WM_CLOSE, 0, 0);
    }
    return TRUE; // 繼續列舉
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow)
{
    EnumWindows(EnumWindowsProc, 0);
    return 0;
}

MFC 專案快速整合

// 在任意命令處理函數中,例如按鈕點擊
void CMyDialog::OnBtnCloseNotepad()
{
    EnumWindows([](HWND hwnd, LPARAM) -> BOOL {
        CString title;
        GetWindowText(hwnd, title.GetBuffer(512), 512);
        title.ReleaseBuffer();
        if (title.Find(_T("記事本")) >= 0) {
            ::SendMessage(hwnd, WM_CLOSE, 0, 0);
        }
        return TRUE;
    }, 0);
}

安全與防禦觀點

  • 防禦:重要程式應註冊為服務或使用 SetProcessShutdownParameters 提高關閉順序,並攔截 WM_CLOSE 檢查呼叫者權限。
  • 濫用風險:此技術屬雙面刃,僅供教學與自動化測試使用,嚴禁用於惡意關閉他人程式。
  • 改進方向:實際惡意碼會維護關鍵字陣列、加密字串、檢查進程路徑而非僅標題,並可能結合 OpenProcess + TerminateProcess 強制結束。

總結

透過 EnumWindows + WM_CLOSE 即可依視窗標題關閉程式,原理簡單卻威力驚人。開發者應理解其機制,以便在自家軟體中加入防禦邏輯,或開發合法的自動化測試工具。

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