Qt在windows下杀死进程:QProcess和系统API两种方式

xiaoxiao2021-02-27  241

虽然方法能查到,这里总结一下,以后方便回顾一下

1、QProcess

QProcess p; QString c = "taskkill /im DingTalk.exe /f"; p.execute(c); p.close();

直接执行CMD中的命令,注意空格!!!

2、系统API

根据进程名称先找到进程PID,再根据PID杀死进程

#include <Windows.h> #include <tlhelp32.h> #include <string.h> using namespace std; /*根据进程名称杀死进程 *1、根据进程名称找到PID *2、根据PID杀死进程 */ int killTaskl(const QString& exe) { //1、根据进程名称找到PID HANDLE hProcessSnap; PROCESSENTRY32 pe32; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { return -1; } pe32.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hProcessSnap, &pe32)) { CloseHandle(hProcessSnap); return -1; } BOOL bRet = FALSE; DWORD dwPid = -1; while (Process32Next(hProcessSnap, &pe32)) { //将WCHAR转成const char* int iLn = WideCharToMultiByte (CP_UTF8, 0, const_cast<LPWSTR> (pe32.szExeFile), static_cast<int>(sizeof(pe32.szExeFile)), NULL, 0, NULL, NULL); std::string result (iLn, 0); WideCharToMultiByte (CP_UTF8, 0, pe32.szExeFile, static_cast<int>(sizeof(pe32.szExeFile)), const_cast<LPSTR> (result.c_str()), iLn, NULL, NULL); if (0 == strcmp(exe.toStdString().c_str(), result.c_str ())) { dwPid = pe32.th32ProcessID; bRet = TRUE; qDebug()<<"zhaodao"; break; } } CloseHandle(hProcessSnap); qDebug()<<dwPid; 2、根据PID杀死进程 HANDLE hProcess=NULL; //打开目标进程 hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,dwPid); if (hProcess==NULL) { qDebug()<<"Open Process fAiled ,error:"<<GetLastError(); return -1; } //结束目标进程 DWORD ret=TerminateProcess(hProcess,0); if(ret==0) { qDebug()<<"kill task faild,error:"<<GetLastError(); return -1; } return 0; }

PS:WCHAR转const char*有更好的方法请留言,谢谢!

转载请注明原文地址: https://www.6miu.com/read-10376.html

最新回复(0)