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

無窗口句柄時按進程名強制結束進程:Toolhelp32 + EnumWindows 組合拳

     編輯:關於C++

核心邏輯

  1. CreateToolhelp32Snapshot 遍歷進程,匹配 EXE 文件名 (不含路徑)。
  2. 獲取目標進程 PID。
  3. EnumWindows 回調中 GetWindowThreadProcessId 比對 PID,找到屬於該進程的頂層窗口。
  4. PostMessage(WM_QUIT) 優雅退出;若需強殺可用 OpenProcess + TerminateProcess。

完整 C 函數


BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam) {
    DWORD dwID;
    GetWindowThreadProcessId(hwnd, &dwID);
    if (dwID == (DWORD)lParam) {
        PostMessage(hwnd, WM_QUIT, 0, 0);
        return FALSE; // 停止枚舉
    }
    return TRUE;
}

void KillProgram(LPCSTR ExeName) {
    if (!ExeName || !ExeName[0]) return;
    // 只取文件名部分
    char *File = strrchr(ExeName, '\\');
    if (File) ExeName = File + 1;

    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap == (HANDLE)-1) return;

    PROCESSENTRY32 pe32 = {0};
    pe32.dwSize = sizeof(pe32);
    if (Process32First(hSnap, &pe32)) {
        do {
            char *p = strrchr(pe32.szExeFile, '\\');
            p = p ? p + 1 : pe32.szExeFile;
            if (strcmpi(p, ExeName) == 0) {
                EnumWindows((WNDENUMPROC)EnumWinProc, pe32.th32ProcessID);
            }
        } while (Process32Next(hSnap, &pe32));
    }
    CloseHandle(hSnap);
}

優化提示

若僅需按文件名匹配,可省略 EnumProcessModules 獲取完整路徑步驟,直接用 pe32.szExeFile 比對,代碼更精簡。

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