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

来源:互联网 发布:淘宝访客其他来源 编辑:程序博客网 时间:2024/06/05 00:42

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

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




原创粉丝点击