根据进程的名称强制关闭该进程Windows的实现方式 MFC

Posted 老虎中的小白Gentle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据进程的名称强制关闭该进程Windows的实现方式 MFC相关的知识,希望对你有一定的参考价值。

我先给一个代码,你可以直接用,什么不用管了

static void kill_process_by_name(char *name)
{
    PROCESSENTRY32 pe32  = {0};//声明一个结构体,用来存放快照进程信息的一个结构体
    HANDLE         hsnap = NULL;

    pe32.dwSize = sizeof(pe32);//指定结构体的大小
    hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //得到系统进程快照的句柄
    if (hsnap == INVALID_HANDLE_VALUE) return; //获取句柄失败

    BOOL ret = Process32First(hsnap, &pe32);//查找系统进程快照中的第一个进程
    while (ret) {
        if (stricmp(pe32.szExeFile, name) == 0) {//判断进程的名称是不是一样
            HANDLE h = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID); //打开一个已存在的进程对象,并返回进程的句柄
            TerminateProcess(h, 0); //终止进程
            CloseHandle(h); //关闭句柄
        }
        ret = Process32Next(hsnap, &pe32); //查找下一个
    }
    CloseHandle(hsnap);
}

从此之后你只有传入进程的名称,就可以强制关闭这个进程了。如果你有空并且还想深究,请认真往下看,定会让你获益匪浅。

查看系统所有进程的ip和名字

void CTestDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//打开控制台,设置可以往控制台写入,显示数据
	AllocConsole();
	freopen("CON", "r", stdin);
	freopen("CON", "w", stdout);
	freopen("CON", "w", stderr);  

	char name[50]{};
	int i{};
	PROCESSENTRY32 pe32 = { 0 };//声明一个结构体
	HANDLE         hsnap = NULL; 

	pe32.dwSize = sizeof(pe32); //指定结构体大小
	hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //得到系统进程快照的句柄
	if (hsnap == INVALID_HANDLE_VALUE) return; //获取句柄失败

	BOOL ret = Process32First(hsnap, &pe32);//查找系统进程快照中的第一个进程
	while (ret) {
		i++;
		cout<<i<<" : " << pe32.szExeFile <<":"<<pe32.th32ProcessID << endl;//输出进程ID
		ret = Process32Next(hsnap, &pe32); //查找下一个
	}
	CloseHandle(hsnap);
	
}

运行结果如下图
在这里插入图片描述
下面详尽地说明,上面两个例子出现的结构体以及函数的用法。

PROCESSENTRY32结构体

结构体的作用:

  • 用来存放快照进程信息的一个结构体。(存放进程信息和调用成员输出进程信息)
  • 用来 Process32First指向第一个进程信息,并将进程信息抽取到PROCESSENTRY32中。用
    Process32Next指向下一条进程信息。

结构体的声明:

  typedef struct tagPROCESSENTRY32
  {
  DWORD dwSize;
  DWORD cntUsage;
  DWORD th32ProcessID;
  ULONG_PTR th32DefaultHeapID;
  DWORD th32ModuleID;
  DWORD cntThreads;
  DWORD th32ParentProcessID;
  LONG pcPriClassBase;
  DWORD dwFlags;
  TCHAR szExeFile[MAX_PATH];
  } PROCESSENTRY32, *PPROCESSENTRY32;

参数说明:
dwSize (结构的大小)这个结构的长度,以字节为单位,初始化一个实例以后调用Process32First函数,设置成员的大小sizeof(PROCESSENTRY32).如果你没用PROCESSENTRY32中的成员dwSize初始化,pricess32First将会失败。

cntUsage (此进程的引用计数)这个成员已经很久没有使用,总是设置为零。

th32ProcessID 进程ID,这个就是任务管理器里面的进程的PID,打开任务管理器–查看—选择列—PID(勾选)就可以显示进程的标示符(PID)

th32DefaultHeapID 进程默认堆ID,这个成员已经很久没有使用,总是设置为零。

th32ModuleID 进程模块ID,这个成员已经很久没有使用,总是设置为零。

cntThreads 此进程开启的线程计数,这个成员执行线程开始的进程。

th32ParentProcessID 父进程的ID。

pcPriClassBase .线程优先权,当前进程创建的任何一个线程的基础优先级,即在当前进程内创建线程的话,其基本优先级的值。

dwFlags 这个成员已经很久没有使用,总是设置为零。

szExeFile (一个数组)进程全名,进程的可执行文件名称。要获得可执行文件的完整路径,应调用Module32First函数,再检查其返回的MODULEENTRY32结构的szExePath成员。但是,如果被调用进程是一个32位程序,您必须调用QueryFullProcessImageName函数去获取64位进程的可执行文件完整路径名。

CreateToolHelp32Snapshot函数

函数作用:
列出所有进程,需要调用CreateToolHelp32Snapshot函数先得到系统进程快照的句柄,函数包含在<tlhelp32.h>头中。

函数声明:

HANDLE_WINAPI CreateToolHelp32Snapshot(
                                       DWORD dwFlags,
                                       DWORD th32ProcessID
                                      );

参数说明:
dwFlags:指定了获取系统进程快照的类型;
th32ProcessID:指向要获取进程快照的ID,获取系统内所有进程快照时是0;

函数返回值
如果函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。

Process32Next函数

函数作用:
再调用Process32Next函数列出系统中其它进程

函数原型:

BOOL Process32Next(
                    HANDLE hSnapshot,
                    LPROCESSENTRY32 lppe
                   );

参数说明:
其中hSnapshot是由CreateToolHelp32Snapshot函数返回的系统进程快照的句柄;
而lppe是指向PROCESSENTRY的结构体指针,进程的详细信息保存在结构体中。

OpenProcess 函数

函数作用:
OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。

函数原型:

HANDLE OpenProcess(
DWORD dwDesiredAccess, 
BOOL bInheritHandle, 
DWORD dwProcessId
);

参数说明:
1.dwDesiredAccess:想拥有的该 进程访问权限
PROCESS_ALL_ACCESS //所有能获得的权限
PROCESS_CREATE_PROCESS //需要创建一个进程
PROCESS_CREATE_THREAD //需要创建一个线程
PROCESS_DUP_HANDLE //重复使用DuplicateHandle句柄
PROCESS_QUERY_INFORMATION //获得进程信息的权限,如它的退出代码、优先级
PROCESS_QUERY_LIMITED_INFORMATION /获得某些信息的权限,如果获得了PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限/
PROCESS_SET_INFORMATION //设置某些信息的权限,如进程优先级
PROCESS_SET_QUOTA //设置内存限制的权限,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME //暂停或恢复进程的权限
PROCESS_TERMINATE //终止一个进程的权限,使用TerminateProcess
PROCESS_VM_OPERATION //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory)
PROCESS_VM_READ //读取进程内存空间的权限,可使用ReadProcessMemory
PROCESS_VM_WRITE //读取进程内存空间的权限,可使用WriteProcessMemory
SYNCHRONIZE //等待进程终止

2.bInheritHandle:表示所得到的进程句柄是否可以被继承

3.dwProcessId:被打开进程的PID

返回说明:

如成功,返回值为指定进程的句柄。
如失败,返回值为NULL,可调用GetLastError()获得错误代码。

TerminateProcess函数

函数作用:

个函数可以用来终止或者说杀死一个进程,它不会留给进程及其所有线程清理的时间,系统会马上终止(杀死)这个进程的所有线程,致使进程终止。在使用此函数前我们必须要调用OpenProcess函数来获得我们要终止(杀死)进程的句柄,并且要获得进程的PROCESS_TERMINATE权限。

函数原型:

BOOL TerminateProcess(HANDLE hProcess,UINT uExitCode)

参数说明:

1、hProcess:要终止(杀死)进程的句柄,需要有PROCESS_TERMINATE权限。
2、uExitCode:设置进程的退出值。可通过GetExitCodeProcess函数得到一个进程的退出值。

返回值说明:

如果失败将返回FALSE(0),而成功将返回一个非零值。
注:不要用if(ret==TRUE)去检测函数是否调用成功,因为函数调用成功会返回一个非零值,但不一定是TRUE(1)

CloseHandle函数

函数原型:

 BOOL CloseHandle(
  HANDLE hObject
  );

参数说明:

hObject :代表一个已打开对象handle。

返回值说明:
TRUE:执行成功;
FALSE:执行失败,可以调用GetLastError()获知失败原因。
  
函数说明:
  关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
  若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。

以上是关于根据进程的名称强制关闭该进程Windows的实现方式 MFC的主要内容,如果未能解决你的问题,请参考以下文章

如何用CMD命令结束一个进程和打开一个程序?

Linux查看服务和强制结束服务

Windows中使用命令行杀进程

Windows中使用命令行杀进程

windows 怎么强制结束任务?

taskkill终止进程的PID