使用CreateToolHelp32Snapshot函数列出所有进程

列出所有进程,需要调用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;
}


结果如图:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值