【WIN32】【C/C++】获取系统当前进程

该博客介绍了如何在Windows环境下使用API接口CreateToolhelp32Snapshot、Process32First和Process32Next获取系统进程快照,并实现进程的枚举和管理。通过封装的getProcess2函数,遍历并打印所有运行的进程,同时提供了查找并结束特定进程(如cmd.exe)的功能。

运行环境

运行环境: vs2008
API接口:CreateToolhelp32Snapshot,Process32First,Process32Next
本文封装接口: getProcess2

输出

加粗样式

代码

// WmicGetProcess.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include <tlhelp32.h>
#include <iostream>
using namespace std;

void getProcess()
{
	cout << __cplusplus << endl;
	system("pause");
	return;
	FILE *file;
	fopen_s(&file,"G:\\allprocess.txt","a+");
	TCHAR c[] = { L"cmd.exe" }; //定义字符串并初始化,c为8长度,最后结尾有'\0',定义一个字符为'x',
	HANDLE handle; //定义CreateToolhelp32Snapshot系统快照句柄
	HANDLE handle1; //定义要结束进程句柄

	//获得系统快照句柄
	handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	PROCESSENTRY32 *info; //定义PROCESSENTRY32结构字指

	//PROCESSENTRY32 结构的 dwSize 成员设置成 sizeof(PROCESSENTRY32)
	info = new PROCESSENTRY32;
	info->dwSize = sizeof(PROCESSENTRY32);

	//调用一次 Process32First 函数,从快照中获取进程列表
	Process32First(handle, info);

	//重复调用 Process32Next,直到函数返回 FALSE 为止
	while (Process32Next(handle, info) != FALSE)
	{
		info->szExeFile; //指向进程名字
		wcout << info->szExeFile << endl;
		fprintf(file, "%ls", info->szExeFile);

		//strcmp字符串比较函数同要结束相同
		if (wcscmp(c, info->szExeFile) == 0)
		{
			//MessageBox (NULL, info->szExeFile, TEXT ("HelloMsg"), 0);
			//PROCESS_TERMINATE表示为结束操作打开,FALSE=可继承,info->th32ProcessID=进程ID
			handle1 = OpenProcess(PROCESS_TERMINATE, FALSE, info->th32ProcessID);
			//结束进程
			TerminateProcess(handle1, 0);
		}
	}
	fclose( file );
}


int getProcess2()
{
	int countProcess=0;									//当前进程数量计数变量
	PROCESSENTRY32 currentProcess;						//存放快照进程信息的一个结构体
	currentProcess.dwSize = sizeof(currentProcess);		//在使用这个结构之前,先设置它的大小
	HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//给系统内的所有进程拍一个快照

	if (hProcess == INVALID_HANDLE_VALUE)
	{
		printf("CreateToolhelp32Snapshot()调用失败!\n");
		return -1;
	}

	bool bMore = Process32First(hProcess, &currentProcess);	//获取第一个进程信息
	while(bMore)
	{
		printf("PID=%5u    PName= %ls", currentProcess.th32ProcessID, &currentProcess.szExeFile);	//遍历进程快照,轮流显示每个进程信息
		cout << &currentProcess.szExeFile << endl;
		bMore=Process32Next(hProcess, &currentProcess);	//遍历下一个
		countProcess++;
	}

	CloseHandle(hProcess);	//清除hProcess句柄
	printf("共有以上%d个进程在运行\n",countProcess);
	system("pause");

	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	getProcess2();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值