Win32API 枚举出当前正在运行的进程

使用Win32API来枚举当前进程

首先需要了解的一个函数就是CreateToolhelp32Snapshot函数,需要用到#include "tlhelp32.h"头文件

这个函数的作用是给系统正在运行的进程建立一个进程快照。

函数原型

HANDLE WINAPI CreateToolhelp32Snapshot(

DWORD dwFlags, 

DWORD th32ProcessID 

);

函数参数

dwFlags

指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个。

TH32CS_INHERIT(0x80000000) - 声明快照句柄是可继承的。

TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。

TH32CS_SNAPHEAPLIST(0x00000001) - 在快照中包含在th32ProcessID中指定的进程的所有的堆。

TH32CS_SNAPMODULE(0x00000008) - 在快照中包含在th32ProcessID中指定的进程的所有的模块。

TH32CS_SNAPPROCESS(0x00000002) - 在快照中包含系统中所有的进程。

TH32CS_SNAPTHREAD(0x00000004) - 在快照中包含系统中所有的线程。

H32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)

th32ProcessID

指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。

接下来写个例子用来打印出当前所有进程名和进程ID:

int main() 
{
	LPCWSTR pwszProcName = NULL;
	HANDLE hProcess = NULL;
	HANDLE hProcSnap = INVALID_HANDLE_VALUE;
	PROCESSENTRY32W pe32w;
	
	hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hProcSnap == INVALID_HANDLE_VALUE) {
		goto L_Cleanup;
	}

	ZeroMemory(&pe32w, sizeof(PROCESSENTRY32W));
	pe32w.dwSize = sizeof(PROCESSENTRY32W);
	if (!Process32FirstW(hProcSnap, &pe32w)) {
		goto L_Cleanup;
	}

	wprintf(L"PID \t	ProcessName\t\n");
	do {
		wprintf(L"%u \t	%s\t\n", pe32w.th32ProcessID, pe32w.szExeFile);

		//需要的话可以在这里使用OpenProcess获取进程的句柄
		hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32w.th32ProcessID);
		if (NULL == hProcess) {
			//获取进程句柄失败
		}
		else {
			//TODO:
		}

	} while (Process32NextW(hProcSnap, &pe32w));

L_Cleanup:

	return 0;
}

打印结果:

Win32API 枚举出当前正在运行的进程_第1张图片

你可能感兴趣的:(windows小记)