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

Toolhelp32 API 枚舉系統進程:CreateToolhelp32Snapshot + Process32First/Next 完整範例

     編輯:關於VC++

前言

Windows 提供 Toolhelp32 快照 API 枚舉系統進程、模組、執行緒、堆疊。本文示範核心流程:CreateToolhelp32Snapshot 取得進程快照 → Process32First/Process32Next 遍歷 → PROCESSENTRY32 讀取進程資訊 (PID、名稱、執行緒數、父進程 ID...),並封裝進類別支援關閉進程。

核心 API 簽名

HANDLE CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID);
// dwFlags: TH32CS_SNAPPROCESS (包含進程列表)
// th32ProcessID: 0 = 當前進程 (通常傳 0 獲取全系統)

BOOL Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
BOOL Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);

PROCESSENTRY32 結構關鍵欄位

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 流程,可快速構建進程監控、管理、診斷工具。

本文配套原始碼含完整任務管理器雛形專案。

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