列出所有进程,需要调用CreateToolHelp32Snapshot函数先得到系统进程快照的句柄,函数包含在<tlhelp32.h>头中。函数的具体格式如下:
HANDLE_WINAPI CreateToolHelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID );其中各个参数含义如下:
dwFlags:指定了获取系统进程快照的类型;
th32ProcessID:指向要获取进程快照的ID,获取系统内所有进程快照时是0;
如果函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。在得到系统进程快照句柄之后,需要调用Process32First函数查找系统进程快照中的第一个进程。函数格式如下:
BOOL Process32First( HANDLE hSnapshot, LPROCESSENTRY32 lppe );再调用Process32Next函数列出系统中其它进程,格式如下:
BOOL Process32Next( HANDLE hSnapshot, LPROCESSENTRY32 lppe );两个函数的参数是一样的,其中hSnapshot是由CreateToolHelp32Snapshot函数返回的系统进程快照的句柄;而lppe是指向PROCESSENTRY的结构体指针,进程的详细信息保存在结构体中。PROCESSENTRY32结构体定义如下:
typedef struct tagPROCESSENTRY32 { DWORD dwSize;//结构大小 DWORD cntUsage;//此进程的引用计数 DWORD th32ProcessID;//进程ID DWORD th32DefaultHeapID;//进程默认堆ID DWORD th32ModuleID;//进程模块ID DWORD cntThreads;//此进程开启的线程计数 DWORD th32ParentProcessID;//父进程ID LONG pcPriClassBase;//线程优先权 DWORD dwFlags;//保留 char szExeFile[MAX_PATH];//进程名 } PROCESSENTRY32;当上述两个函数列举到进程时返回TRUE,否则返回FALSE。当列举到一个进程时lppe参数就会返回进程的详细信息,所以用户就可以读取这些进程的信息,然后输出。
列举完后,需要调用CloseHandle函数关闭系统进程句柄。具体代码如下:
#include <stdio.h> #include <windows.h> #include <string.h> #include <tlhelp32.h> int GetProcess() { //PROCESSENTRY32结构体,保存进程具体信息 PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); //获得系统进程快照的句柄 HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { printf("CreateToolhelp32Snapshot error.\n"); return 0; } //首先获得第一个进程 BOOL bProcess = Process32First(hProcessSnap, &pe32); //循环获得所有进程 while (bProcess) { //打印进程名和进程ID printf("%ls----%d\n", pe32.szExeFile, pe32.th32ProcessID); bProcess = Process32Next(hProcessSnap, &pe32); } CloseHandle(hProcessSnap); return 0; } int main() { GetProcess(); return 0; }