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


    一、方式一

    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]);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    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;
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    八大排序之归并排序
    通信原理学习笔记3-2:数字通信系统概述(信源编码/压缩编码、信道编码和交织)
    python舔狗学习日记第三期【帮女神自动化生成日报】
    几个常用的nosql数据库的操作方式
    Unity3D 关于过大的UI帧动画如何处理详解
    Spring Boot 多数据源配置
    高等数学(第七版)同济大学 习题3-8 个人解答
    玩转数据库索引
    Verilog刷题[hdlbits] :Vector100r
    通过浏览器F12开发者工具的javascript控制台给Vue表单赋值
  • 原文地址:https://blog.csdn.net/gongxie0235/article/details/127976618