CreateToolhelp32Snapshot() 函数可获取系统中进程的快照,或指定进程的快照,包括堆,线程,模块等,原型如下:HANDLE WINAPI CreateToolhelp32Snapshot(
__in DWORD dwFlags,
__in DWORD th32ProcessID
); dwFlags 是输入参数,表示想要获取的快照信息,有不同的取值:TH32CS_INHERIT,TH32CS_SNAPALL,TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPMODULE32,TH32CS_SNAPPROCESS 以及 TH32CS_SNAPTHREAD 。提供不同的值,会获得不同的快照。在获取快照后,可以用不同的 API 函数进行枚举。
th32ProcessID 是输入参数,指定一个 PID 号。当其为 0 时表示当前进程,它只对第 1 个参数为 TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE, TH32CS_SNAPMODULE32, 或 TH32CS_SNAPALL 时有效。在 dwFlags 为 TH32CS_SNAPPROCESS 时,它若为 0,那么获得系统的所有进程列表。
使用该函数时,要包含 tlhelp32.h 头文件。
测试代码:
[C++] 纯文本查看 复制代码 // Process.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <tlhelp32.h>
int KillProcess(DWORD Pid)
{
//打开进程得到进程句柄
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
if(hProcess==NULL)
{
printf("OpenProcess error\n");
return 0;
}
//结束进程
if (TerminateProcess(hProcess,0))
{
printf("结束进程成功\n");
return 0;
}
else
{
printf("结束进程失败\n");
return 0;
}
}
int GetProcess()
{
char buff[1024]={0};
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
//获得系统内所有进程快照
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot error");
return 0;
}
//枚举列表中的第一个进程
BOOL bProcess = Process32First(hProcessSnap,&pe32);
while(bProcess)
{
//格式化进程名和进程ID
wsprintf(buff,"%s---------------%d\r\n",pe32.szExeFile,pe32.th32ProcessID);
//输出进程名和进程ID
printf(buff);
memset(buff,0x00,1024);
//继续枚举进程
bProcess = Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return 0;
}
int main(int argc, char* argv[])
{
if(argc == 2&&strcmp(argv[1],"list")==0)
{
GetProcess();
}
if(argc == 3&&strcmp(argv[1],"kill")==0)
{
KillProcess(atoi(argv[2]));
}
return 0;
}
在以 list 选项来运行该程序时,可以看到输出:
|