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

Win32 API 枚舉視窗與進程全平台指南:ToolHelp32 與 PSAPI 統一封裝

     編輯:關於VC++

任務管理器核心功能:枚舉頂層視窗與系統進程。視窗用 EnumWindows (回調 + LPARAM) 避免 Z-Order 干擾;進程枚舉因平台差異需分庫處理:

平台相關 API 選擇

系統庫關鍵函數
Win9x/Me/2000/XPToolHelp32 (KERNEL32.dll)CreateToolhelp32Snapshot, Process32First/Next
Windows NT 4.0PSAPI (PSAPI.dll)EnumProcesses, EnumProcessModules, GetModuleFileNameEx

ToolHelp32 枚舉流程

  1. CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS) 獲取快照句柄
  2. Process32First 取首項,PROCESSENTRY32.dwSize 必須預設
  3. 循環 Process32Next 直到 FALSE,提取 th32ProcessID、szExeFile
  4. CloseHandle 釋放快照

PSAPI 枚舉流程

  1. 分配 DWORD 陣列,反覆調用 EnumProcesses 直到 cbNeeded < cb (文檔不保證一次足夠)
  2. 遍歷 PID 陣列:OpenProcess → EnumProcessModules 取首模組句柄 → GetModuleFileNameEx/BaseName 取路徑/名稱

16 位任務枚舉 (NT 系列)

NTVDM (虛擬 DOS 機) 中運行。先 VDMEnumProcessWOW 列舉含 WowExec.exe 的 NTVDM 進程,再對每 PID 調用 VDMEnumTaskWOWEx 列舉任務,回調提供模組名、檔案名、16 位句柄。需鏈接 VDMDBG.lib、包含 vdmdbg.h。

統一封裝:EnumProcs 回調介面

BOOL WINAPI EnumProcs(PROCENUMPROC lpProc, LPARAM lParam);
// 回調原型
BOOL CALLBACK Proc(DWORD dwPID, WORD w16Task, LPCSTR lpstrFile, LPARAM lParam);
// w16Task=0 表示 32 位進程;9x 下恆為 0

內部動態載入 ToolHelp32/PSAPI/VDMDBG (顯式鏈接 LoadLibrary/GetProcAddress),實現二進制級跨平台相容。附帶完整封裝源碼,可直接集成專案。

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