CreateToolhelp32Snapshot 遍歷進程,匹配 EXE 文件名 (不含路徑)。EnumWindows 回調中 GetWindowThreadProcessId 比對 PID,找到屬於該進程的頂層窗口。PostMessage(WM_QUIT) 優雅退出;若需強殺可用 OpenProcess + TerminateProcess。
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 比對,代碼更精簡。