您的位置:首页 > 编程语言 > Qt开发

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

2017-07-10 08:44 477 查看

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

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*有更好的方法请留言,谢谢!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐