Windows下C++获取系统进程列表及相关信息

一、方式一

1、获取进程id列表

主要使用 EnumProcesses 函数

	ULONG ulPid = 0;
	//保存进程缓存区
	DWORD dwProcIdArray[MAX_PATH * 4] = { 0 };
	ULONG ulProcArrayLen = 0;
	/* 枚举进程 */
	if (!EnumProcesses(dwProcIdArray, sizeof(dwProcIdArray), &ulProcArrayLen))
		return ulPid;
	/* 枚举进程信息 */
	for (int i = 0; i < (ulProcArrayLen / sizeof(DWORD)); i++)
	{
		printf("%d",dwProcIdArray[i]);
	}

参数说明:
第一个参数 保存进程缓存区
第二个参数 缓存区大小,以字节为单位
第三个参数 返回实际写入的大小,以字节为单位

PS:
若第三个参数等于第二个参数,即写入的大小和缓存区的大小是相等的,则可能需要考虑缓存区是否太小导致没有写入全部的进程,此时需要给缓存区分配更大的空间

2、获取进程完整路径

主要流程如下:
1)使用 OpenProcess 函数打开进程句柄
2)使用 GetModuleFileName/GetProcessImageFileName/QueryFullProcessImageName 函数获取进程完整路径
ps:
Windows 2000 建议 GetModuleFileName()
Windows XP x32 建议 GetProcessImageFileName()
Windows XP x64 建议 GetProcessImageFileName()
Windows Vista 建议 QueryFullProcessImageName()
Windows 7 以后 建议 QueryFullProcessImageName()

	
	TCHAR       szImagePath[MAX_PATH * 2 - 1] = { 0 };
	HANDLE      hProcess;

	if (!pwszFullPath)
		return FALSE;
	//dwPID  进程id
	hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
	if (!hProcess)
		return FALSE;

	if (!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH * 2 - 1))
	{
		CloseHandle(hProcess);
		return FALSE;
	}

3、获取进程创建时间

主要流程如下:
1)使用 OpenProcess 打开进程句柄
2)使用 GetProcessTimes 获取进程相关时间

	FILETIME CreationTime,ExitTime,KernelTime,UserTime;
	HANDLE      hProcess;

	if (!pwszFullPath)
		return FALSE;
	//dwPID  进程id
	hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
	if (!hProcess)
		return FALSE;

	if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime,&KernelTime,&UserTime))
	{
		CloseHandle(hProcess);
		return FALSE;
	}

参数说明:
第二个参数 进程创建时间结构体
第三个参数 进程退出时间结构体

PS:
所有时间都使用 FILETIME 数据结构表示。 这种结构包含两个 32 位值,这些值组合成 64 位计数 100 纳秒的时间单位。
进程创建和退出时间是时间点,表示为自 1601 年 1 月 1 日 1601 年 1 月 1 日午夜以来在英格兰格林威治运行的时间量。 应用程序可以使用多个函数将此类值转换为更通用的表单。

二、方式二

主要流程如下:
1)创建快照
2)循环获取所有进程信息

	HANDLE         hProcessSnap;   // 进程快照句柄
	PROCESSENTRY32 stcPe32 = { 0 };  // 进程快照信息
	BOOLEAN isSuccess = FALSE;
	stcPe32.dwSize = sizeof(PROCESSENTRY32);

	// 1. 创建一个进程相关的快照句柄
	hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hProcessSnap == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}

	// 2. 通过进程快照句柄获取第一个进程信息
	if (!Process32First(hProcessSnap, &stcPe32))
	{
		CloseHandle(hProcessSnap);
		return FALSE;
	}
	// 3. 循环遍历进程信息
	do
	{
		//stcPe32:进程信息
	} while (Process32Next(hProcessSnap, &stcPe32));
	// 4. 关闭句柄退出函数
	CloseHandle(hProcessSnap);

你可能感兴趣的:(windows,C++,windows)