遍历进程需要几个API和一个结构体

​ 1.创建进程快照

​ 2.初始化第一个要遍历的进程

​ 3.继续下次遍历

​ 4.进程信息结构体

API:

1.创建进程快照
1
2
3
4
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);

创建进程快照需要包含头文件 Tlhelp32.h

返回值:

  • ​ 成功=> 快照句柄

  • ​ 失败=> INVALID_HANDLE_VALUE

2.获得第一个进程的句柄
1
2
3
4
BOOL WINAPI Process32First(
    HANDLE hSnapshot,//_in,进程快照句柄
    LPPROCESSENTRY32 lppe//_out,传入进程信息结构体,系统帮你填写.
);

返回值:

  • ​ 成功=> TRUE
  • ​ 失败=> FALSE

其中PROCESSENTRY32结构为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
typedef struct tagPROCESSENTRY32 {
    DWORD dwSize; // 结构大小,首次调用之前必须初始化;
    DWORD cntUsage; // 此进程的引用计数,为0时则进程结束;
    DWORD th32ProcessID; // 进程ID;
    DWORD th32DefaultHeapID; // 进程默认堆ID;
    DWORD th32ModuleID; // 进程模块ID;
    DWORD cntThreads; // 此进程开启的线程计数;
    DWORD th32ParentProcessID;// 父进程ID;
    LONG pcPriClassBase; // 线程优先权;
    DWORD dwFlags; // 保留;
    char szExeFile[MAX_PATH]; // 进程全名;
} PROCESSENTRY32;

对我们有用的就是

dwSize 初始化结构体的大小

th32ProcessId 进程ID

szExeFile[MAX_PATH] 进程路径

3.获得下一个进程
1
2
3
4
BOOL WINAPI Process32Next(
  HANDLE hSnapshot,        CreateToolhelp32Snapshot 返回的句柄
  LPPROCESSENTRY32 lppe     指向PROCESSENTRY32结构的指针,进程信息结构体
);

实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
int main(int argc, char* argv[])
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if (INVALID_HANDLE_VALUE != hSnapshot)
    {
        PROCESSENTRY32 pi; 
    	pi.dwSize = sizeof(PROCESSENTRY32);
    	BOOL bRet = Process32First(hSnapshot,&pi);
    	while (bRet)
    	{
        	printf("进程ID = %d ,进程名称 = %s\r\n",pi.th32ProcessID,pi.szExeFile);
        	bRet = Process32Next(hSnapshot,&pi);
    	}
    }
    return 0;
}