1.CreateToolhelp32Snapshot()。这一种是比较常见的,利用进程快照进行枚举进程,主要利用CreateToolhelp32Snapshot()、Process32First()和 Process32Next()三个函数。下面直接上代码:
// CreateToolhelp32Snapshot.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <tlhelp32.h>
int main()
{
//创建快照句柄,CreateToolhelp32Snapshot()函数返回当前运行的进程快照句柄
HANDLE ToolHelpHandle = NULL;
//PROCESSENTRY32结构体记录当前进程的一些信息,其中dwSize必须指定大小,大小为当前结构体大小
PROCESSENTRY32 ProcessEntry32 = { 0 };
ProcessEntry32.dwSize = sizeof(PROCESSENTRY32);
ToolHelpHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (ToolHelpHandle == INVALID_HANDLE_VALUE)
{
return FALSE;
}
BOOL bOk = Process32First(ToolHelpHandle, &ProcessEntry32);
while (bOk)
{
printf("PID:\t0x%X,", ProcessEntry32.th32ProcessID);
printf("\tName:\t%S\r\n", ProcessEntry32.szExeFile);
bOk = Process32Next(ToolHelpHandle, &ProcessEntry32);
}
CloseHandle(ToolHelpHandle);
ToolHelpHandle = INVALID_HANDLE_VALUE;
return 0;
}
2.EnumProcesses()。利用Psapi下EnumProcesses()函数进行枚举进程,该方法有可能得不到某些进程的名称,下面是代码:
#include "stdafx.h"
#include <Windows.h>
#include <Psapi.h>
#define MAXPROCESSES 1024
void PrintProcessNameAndID(DWORD ProcessID);
int main()
{
// 定义参数,EnumProcesses有三参数,接收进程标示符的数组,数组大小,数组返回字节数(真实接收数组的大小)
DWORD Processes[MAXPROCESSES], Size, ProcessesNumber;
if (!EnumProcesses(Processes, sizeof(Processes), &Size))
{
return 1;
}
//计算进程总数
ProcessesNumber = Size / sizeof(DWORD);
//打印各个进程
for (int i = 0; i < ProcessesNumber; i++)
{
if (Processes[i] !=