根据进程的名称强制关闭该进程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的主要内容,如果未能解决你的问题,请参考以下文章