代码部分
void GlobalTool::killProcess(QString processName) {
qInfo() << "删掉进程" << processName;
if (processName.isEmpty()) {
qCritical() << "进程名为空";
return;
}
HANDLE handle32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == handle32Snapshot) {
qCritical() << "创建搜索进程失败";
return;
}
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof(PROCESSENTRY32);
//Search for all the process and terminate it
//首先获得第一个进程
BOOL bProcess = Process32First(handle32Snapshot, &pEntry);
//循环获得所有进程
while (bProcess) {
QString thisProcessName = QString::fromWCharArray(pEntry.szExeFile);
if (thisProcessName == processName) {
qInfo() << "找到目标进程";
HANDLE handLe = OpenProcess(PROCESS_TERMINATE, FALSE, pEntry.th32ProcessID);
if (handLe == NULL) {
qCritical() << "没有打开目标进程";
return;
}
BOOL ret = TerminateProcess(handLe, 0);
qInfo() << "关闭目标进程是否成功:" << (ret ? "成功" : "失败");
}
bProcess = Process32Next(handle32Snapshot, &pEntry);
}
CloseHandle(handle32Snapshot);
}
CreateToolhelp32Snapshot 获取系统进程
官方讲解
这里的调用
是要包含所有的进程 并且第二个参数忽略表示
返回值
如果函数成功,它将返回指定快照的打开句柄。
不成功返回INVALID_HANDLE_VALUE
PROCESSENTRY32 描述采用快照时驻留在系统地址空间中的进程的列表中的条目
程序讲解
此程序是获取 快照中的所有进程名称再和指定名称进行对比 如果是指定名称就会先调用
OpenProcess 去打开已经打开的进程并获取进程的句柄
获取成功后调用TerminateProcess 去关闭指定的进程
可能程序中指定的进程不止一个 所有要循环遍历所有的进程再进行清理
关闭完所有的指定进程后 再调用CloseHandle 关闭这个快照进程句柄