在 C 語言中,標準庫並未提供直接操作進程的功能,因為進程管理屬於作業系統層面的功能。若在 Windows 環境下開發,最常用的方法是使用 ToolHelp Library(工具幫助庫)提供的 API 來遍歷系統進程快照,找到目標進程後再呼叫 TerminateProcess 將其關閉。
CreateToolhelp32Snapshot:建立系統進程的快照。Process32First / Process32Next:遍歷快照中的進程項目。OpenProcess:取得進程控制代碼(需 PROCESS_TERMINATE 權限)。TerminateProcess:強制終止指定進程。CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) 取得進程快照控制代碼。Process32First 獲取第一個進程資訊,填入 PROCESSENTRY32 結構(注意先設定 dwSize)。Process32Next 逐一比對進程名稱(szExeFile 欄位)。OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID) 取得進程控制代碼。TerminateProcess(hProcess, 0) 終止進程,並關閉相關控制代碼。#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <tchar.h>
BOOL TerminateProcessByName(LPCTSTR szProcessName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) return FALSE;
PROCESSENTRY32 pe = { sizeof(PROCESSENTRY32) };
BOOL bFound = FALSE;
if (Process32First(hSnapshot, &pe)) {
do {
if (_tcsicmp(pe.szExeFile, szProcessName) == 0) {
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);
if (hProcess) {
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
bFound = TRUE;
}
}
} while (Process32Next(hSnapshot, &pe));
}
CloseHandle(hSnapshot);
return bFound;
}
int main()
{
if (TerminateProcessByName(_T("notepad.exe"))) {
_tprintf(_T("進程已成功終止。\n"));
} else {
_tprintf(_T("未找到目標進程或終止失敗。\n"));
}
return 0;
}
終止進程屬於高風險操作,可能導致資料遺失或系統不穩定。實際專案中建議優先嘗試優雅關閉(如發送 WM_CLOSE 訊息),僅在必要時使用強制終止。此外,若目標進程以較高權限執行,呼叫端也需具備相應權限(如以系統管理員身分執行)。