C++获取windows中所有进程,使用pid杀死进程,并用map保存进程id与name以备后用

0.windows CMD命令tasklist

  • 我们都知道windows的cmd命令tasklist可以打印出系统当前所有进程的pid和内存使用
  • 我们怎么用c++自己写一个程序实现这个功能?

1.clion下能使用的代码

#include <iostream>
#include <string>
#include <map>
#include <windows.h>
#include <TlHelp32.h>


bool TraverseProcesses(std::map<std::string,int> &_mapProcess)
{
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(pe32);

    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if(hProcessSnap == INVALID_HANDLE_VALUE) {
        std::cout << "Create Toolhelp32Snapshot Error!" << std::endl;
        return false;
    }

    BOOL bResult =Process32First(hProcessSnap, &pe32);//开始遍历

    int num(0);

    while(bResult)
    {
        std::string name = pe32.szExeFile;
        int id = pe32.th32ProcessID;

        std::cout << "[" << ++num << "]: "<< "--ProcessID:" << id;

        std::cout<<"--Process Name:" << name<<std::endl;

        _mapProcess.insert(std::pair<std::string, int>(name, id)); //字典存储
        bResult = Process32Next(hProcessSnap,&pe32);//返回值为false,表明进程遍历完
    }

    CloseHandle(hProcessSnap);
    return true;
}
int main()
{
    std::map<std::string,int> mapProcess;

    DWORD start = ::GetTickCount();//返回操作系统启动到现在经过的毫秒数
    TraverseProcesses(mapProcess);

    DWORD end = ::GetTickCount();
    std::cout<<"waste time(ms):"<<end-start<<std::endl;
    return 0;
}

2.vs2008下能使用的代码

// process_operate.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <windows.h>
#include <TlHelp32.h>


bool TraverseProcesses(std::map<std::wstring,int> &_mapProcess)
{
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(pe32);

	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if(hProcessSnap == INVALID_HANDLE_VALUE) {
		std::cout << "Create Toolhelp32Snapshot Error!" << std::endl;
		return false;
	}

	BOOL bResult =Process32First(hProcessSnap, &pe32);//开始遍历

	int num(0);

	while(bResult)
	{
		std::wstring name = pe32.szExeFile;
		int id = pe32.th32ProcessID;

		std::cout << "[" << ++num << "]: "<< "--ProcessID:" << id;

		std::wcout<<"--Process Name:" << name<<std::endl;

		_mapProcess.insert(std::pair<std::wstring, int>(name, id)); //字典存储
		bResult = Process32Next(hProcessSnap,&pe32);//返回值为false,表明进程遍历完
	}

	CloseHandle(hProcessSnap);
	return true;
}
int main()
{
	std::map<std::wstring,int> mapProcess;

	DWORD start = ::GetTickCount();//返回操作系统启动到现在经过的毫秒数
	TraverseProcesses(mapProcess);

	DWORD end = ::GetTickCount();
	std::cout<<"waste time(ms):"<<end-start<<std::endl;
	system("pause");
	return 0;
}

3.vs2008下遍历进程+杀死进程完整程序

  • 杀死进程,首先要将当前程序提权,有杀死别的程序的权限后,调用TerminateProcess函数杀死进程。
  • 这个过程不一定成功,前提是要杀死的进程没有用hook钩子屏蔽系统的TerminateProcess函数生效,亲测微信可以被杀死。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <windows.h>
#include <TlHelp32.h>


bool TraverseProcesses(std::map<std::wstring,int> &_mapProcess)
{
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(pe32);

	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if(hProcessSnap == INVALID_HANDLE_VALUE) {
		std::cout << "Create Toolhelp32Snapshot Error!" << std::endl;
		return false;
	}

	BOOL bResult =Process32First(hProcessSnap, &pe32);//开始遍历

	int num(0);

	while(bResult)
	{
		std::wstring name = pe32.szExeFile;
		int id = pe32.th32ProcessID;

		std::cout << "[" << ++num << "]: "<< "--ProcessID:" << id;

		std::wcout<<"--Process Name:" << name<<std::endl;

		_mapProcess.insert(std::pair<std::wstring, int>(name, id)); //字典存储
		bResult = Process32Next(hProcessSnap,&pe32);//返回值为false,表明进程遍历完
	}

	CloseHandle(hProcessSnap);
	return true;
}
void EnableDebugPriv() {
	HANDLE hToken;
	TOKEN_PRIVILEGES tkp;
	OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
	LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
	tkp.PrivilegeCount = 1;
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);
	CloseHandle(hToken);
}

int KillProcess(int id)   //根据进程ID杀进程
{
	HANDLE hProcess=NULL;
	hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,id);	//打开目标进程
	if (hProcess==NULL) {
		wprintf(L"\nOpen Process fAiled:%d\n",GetLastError());
		return -1;
	}
	DWORD ret=TerminateProcess(hProcess,0);	//结束目标进程
	if(ret==0) {
		wprintf(L"%d",GetLastError());
	}
	return -1;
}

int main()
{
	std::map<std::wstring,int> mapProcess;

	DWORD start = ::GetTickCount();//返回操作系统启动到现在经过的毫秒数
	TraverseProcesses(mapProcess);

	DWORD end = ::GetTickCount();
	std::cout<<"use time(ms):"<<end-start<<std::endl;
	std::cout<<"please input pid of process you want to kill(use CTR+Z to end program):";
	int pid;
	while (std::cin>>pid)
	{
		if(KillProcess(pid) == -1)
		{
			std::cout<<"Kill process success."<<std::endl;
		}
		std::cout<<"Please input pid of process you want to kill:";
	}

	system("pause");
	return 0;
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值