首先,調用 CreateToolhelp32Snapshot() 獲得當前運行進程的快照,這個函數返回包含正在運行進程的快照句柄。其原形是:
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);
其中:
dwFlags表示要包含在快照的內容為TH32CS_SNAPPROCESS表示在快照中包含進程列表;
th32ProcessID是進程號,為0表示當前進程。
返回值是一個句柄,如果沒有進程正在運行,則返回INVALID_HANDLE_VALUE(可用GetLastError()獲得),反之可用BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);獲取返回的進程
如果Process32First返回TRUE,則第一個進程的信息已經在LPPROCESSENTRY32結構中,其余進程信息可用BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe)獲得
LPPROCESSENTRY32結構的定義如下:
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; //此結構的大小
DWORD cntUsage; //進程的引用數,如果為0,則次進程已停止
DWORD th32ProcessID; //進程號
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; //此進程引用的模塊ID
DWORD cntThreads; //此進程創建的線程數
DWORD th32ParentProcessID; //父進程的ID
LONG pcPriClassBase; //這個進程創建的線程的基本優先權
DWORD dwFlags; //保留
TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;
typedef PROCESSENTRY32 *PPROCESSENTRY32;
最後不要忘了調用:
CloseHandle();
另用函數是:
HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance option
DWORD dwProcessId // process identifier
);
用它可打開一個進程,打開進程後,可用:
BOOL TerminateProcess(
HANDLE hProcess, // handle to the process
UINT uExitCode // exit code for the process
);
來關閉進程。
筆者用上述函數做了一個類似任務管理器的進程管理器可以枚舉所有進程、關閉進程。細節請參見源代碼。
本文配套源碼