Windows 提供 Toolhelp32 快照 API 枚舉系統進程、模組、執行緒、堆疊。本文示範核心流程:CreateToolhelp32Snapshot 取得進程快照 → Process32First/Process32Next 遍歷 → PROCESSENTRY32 讀取進程資訊 (PID、名稱、執行緒數、父進程 ID...),並封裝進類別支援關閉進程。
HANDLE CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID);
// dwFlags: TH32CS_SNAPPROCESS (包含進程列表)
// th32ProcessID: 0 = 當前進程 (通常傳 0 獲取全系統)
BOOL Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
BOOL Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; // 必須先設定 = sizeof(PROCESSENTRY32)
DWORD cntUsage;
DWORD th32ProcessID; // 進程 ID (PID)
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; // 主模組 ID
DWORD cntThreads; // 執行緒數
DWORD th32ParentProcessID; // 父進程 ID
LONG pcPriClassBase; // 基礎優先權
DWORD dwFlags;
TCHAR szExeFile[MAX_PATH]; // 可執行檔名稱
} PROCESSENTRY32;
void ListAllProcesses()
{
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == INVALID_HANDLE_VALUE) return;
PROCESSENTRY32 pe = { sizeof(pe) };
if (Process32First(hSnap, &pe))
{
do
{
_tprintf(_T("PID=%5u Threads=%3u Parent=%5u %s\n"),
pe.th32ProcessID, pe.cntThreads, pe.th32ParentProcessID, pe.szExeFile);
} while (Process32Next(hSnap, &pe));
}
CloseHandle(hSnap);
}
BOOL KillProcessByName(LPCTSTR exeName)
{
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == INVALID_HANDLE_VALUE) return FALSE;
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL found = FALSE;
if (Process32First(hSnap, &pe))
{
do
{
if (_tcsicmp(pe.szExeFile, exeName) == 0)
{
HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);
if (hProc)
{
TerminateProcess(hProc, 0);
CloseHandle(hProc);
found = TRUE;
}
}
} while (Process32Next(hSnap, &pe));
}
CloseHandle(hSnap);
return found;
}
作者實作類別支援:列舉所有進程、顯示於 ListCtrl、雙擊/右鍵選單終止進程、自動刷新。核心邏輯同上,UI 部分略。
| 議題 | 說明 |
|---|---|
| 權限 | 終止系統服務/其他使用者進程需管理員權限 (UAC 提權) |
| 快照一致性 | 快照為呼叫瞬間靜態影像,遍歷過程中系統進程變動不反映 |
| 64 位元進程 | 32 位元應用需編譯為 64 位元或啟用 WoW64 才能正確枚舉 64 位元進程完整資訊 |
| 替代方案 | PSAPI EnumProcesses + OpenProcess + GetModuleBaseName (較舊);WMI Win32_Process (查詢豐富但較慢) |
Toolhelp32 API 是 Windows 列舉進程最直接、效能最佳的原生方式。掌握 CreateToolhelp32Snapshot → Process32First/Next → PROCESSENTRY32 流程,可快速構建進程監控、管理、診斷工具。
本文配套原始碼含完整任務管理器雛形專案。