EnumProcesses() 与 CreateToolhelp32Snapshot()

作者:编程家 分类: c++ 时间:2025-11-28

通过使用Windows API函数EnumProcesses()和CreateToolhelp32Snapshot(),我们可以轻松地获取正在运行的进程列表并获取有关这些进程的详细信息。本文将介绍如何使用这两个函数来获取进程列表,并提供一个实际案例代码来演示其用法。

获取进程列表

要获取正在运行的进程列表,我们可以使用EnumProcesses()函数。该函数需要两个参数,一个用于存储进程ID的数组和一个表示数组大小的参数。该函数将返回一个布尔值,指示是否成功获取进程列表。

下面是一个简单的示例代码,演示如何使用EnumProcesses()函数来获取进程ID列表:

c++

#include

#include

int main()

{

DWORD processes[1024];

DWORD cbNeeded;

// 获取进程列表

if (EnumProcesses(processes, sizeof(processes), &cbNeeded))

{

// 计算进程数量

DWORD numProcesses = cbNeeded / sizeof(DWORD);

// 输出进程ID

for (DWORD i = 0; i < numProcesses; i++)

{

std::cout << "Process ID: " << processes[i] << std::endl;

}

}

else

{

std::cout << "Failed to get the process list." << std::endl;

}

return 0;

}

此代码将输出正在运行的进程的ID列表。请注意,我们将进程ID存储在一个DWORD类型的数组中,并根据返回的cbNeeded值计算进程数量。

获取进程详细信息

要获取进程的详细信息,我们可以使用CreateToolhelp32Snapshot()函数。该函数需要两个参数,一个表示快照类型的标志和一个表示进程快照的ID。该函数将返回一个句柄,我们可以使用该句柄来遍历进程快照并获取进程的详细信息。

下面是一个示例代码,演示如何使用CreateToolhelp32Snapshot()函数来获取进程详细信息:

c++

#include

#include

#include

int main()

{

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hSnapshot != INVALID_HANDLE_VALUE)

{

PROCESSENTRY32 pe32;

pe32.dwSize = sizeof(PROCESSENTRY32);

// 遍历进程快照

if (Process32First(hSnapshot, &pe32))

{

do

{

std::cout << "Process ID: " << pe32.th32ProcessID << std::endl;

std::cout << "Process Name: " << pe32.szExeFile << std::endl;

std::cout << "Parent Process ID: " << pe32.th32ParentProcessID << std::endl;

std::cout << std::endl;

} while (Process32Next(hSnapshot, &pe32));

}

}

else

{

std::cout << "Failed to create the process snapshot." << std::endl;

}

CloseHandle(hSnapshot);

return 0;

}

此代码将输出每个进程的ID,名称和父进程ID。我们使用了PROCESSENTRY32结构来存储进程详细信息,然后使用Process32First()和Process32Next()函数来遍历进程快照。

案例代码解释

上述案例代码中,我们首先调用CreateToolhelp32Snapshot()函数来创建进程快照。我们使用TH32CS_SNAPPROCESS标志来指定我们只想获取进程快照。然后,我们检查返回的句柄是否有效。如果句柄有效,我们使用PROCESSENTRY32结构和Process32First()函数来获取第一个进程的详细信息。然后,我们使用Process32Next()函数来获取下一个进程的详细信息,直到遍历完整个进程快照。最后,我们调用CloseHandle()函数来关闭进程快照句柄。

通过使用EnumProcesses()和CreateToolhelp32Snapshot()函数,我们可以轻松地获取正在运行的进程列表并获取有关这些进程的详细信息。本文提供了一个简单的示例代码,演示了如何使用这两个函数来获取进程列表和进程详细信息。这些函数在编写进程管理工具和系统监控工具时非常有用。希望本文能够帮助你理解如何使用这些函数,并在你的项目中实现相关功能。