如何通过进程名字关闭系统正在运行的进程

时间:2022-07-20 16:42:35

STEP ONE

终止正在运行的进程,我们用TerminateProcess()函数,函数原型:

BOOL TerminateProcess(
HANDLE
hProcess, // handle to the process
UINT uExitCode // exit code for the process
);

So,在这儿,我们需要获得需要终止的进程的句柄。


STEP TWO

因此,我们想到函数OpenProcess(),函数原型:

HANDLE OpenProcess(
DWORD
dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance flag
DWORD dwProcessId // process identifier
);
这样,问题转到获取进程ID。


STEP THREE

用CreateToolhelp32Snapshot()函数获得进程切片,然后通过函数Process32First()和Process32Next()依次获得进程信息(包括进程名和进程ID)。

各函数原型如下:

HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD
dwFlags,
DWORD
th32ProcessID
);
BOOL WINAPI Process32First(
HANDLE
hSnapshot,
LPPROCESSENTRY32
lppe
);
BOOL WINAPI Process32Next(
HANDLE
hSnapshot,
LPPROCESSENTRY32
lppe
);
解释:

CreateToolhelp32Snapshot函数为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]。
  参数:
  dwFlags
  [输入]指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个。
  TH32CS_INHERIT - 声明快照句柄是可继承的。
  TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
  TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。
  TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。
  TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。
  TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。
  Const TH32CS_SNAPHEAPLIST = &H1
  Const TH32CS_SNAPPROCESS = &H2
  Const TH32CS_SNAPTHREAD = &H4
  Const TH32CS_SNAPMODULE = &H8
  Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
  Const TH32CS_INHERIT = &H80000000
  th32ProcessID
  [输入]指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。
  返回值:
  调用成功,返回快照的句柄,调用失败,返回INVALID_HANDLE_VALUE 。

STEP FOUR

具体实现代码(附详细注释):

#include "stdafx.h"




#include <iostream>
#include <Tlhelp32.h>

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获取进程切片
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
std::cout << "获取系统进程切片失败" << std::endl;
return 1;
}

PROCESSENTRY32 pe32 = { sizeof(pe32) }; //保存进程切片的临时变量

if (!Process32First(hProcessSnap, &pe32)) //获取第一个进程切片
{
std::cout<<"获取切片进程失败"<<std::endl;
}

int i = 0;//进程计数

do //依次获取进程切片
{
++i;

char name[100] = {0}; //打印进程名
sprintf_s(name, "%d: %S",i, pe32.szExeFile);
std::cout << name << std::endl;

//找到Win32Project1.exe后,获取句柄,终止进程
if (0==_tcscmp(pe32.szExeFile,TEXT("Win32Project1.exe")))
{
HANDLE hGUI = OpenProcess(PROCESS_ALL_ACCESS, true, pe32.th32ProcessID);
if (NULL == hGUI)
{
std::cout << "获取进程句柄失败" << std::endl;
return 1;
}
TerminateProcess(hGUI, 0); //终止进程
}

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

return 0;
}



另外一种有效的方法:

Enumerating All Processes(From MSDN)

使用EnumProcesses函数遍历进程