QT使用QProcess类,判断某个进程是否存在
Posted Fu_Lin_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT使用QProcess类,判断某个进程是否存在相关的知识,希望对你有一定的参考价值。
前言
需求是判断win系统中,Qt 拉起某个程序,如果程序不存在则拉起,存在则实现程序进程切换,如果要进行这样的逻辑操作,就必须要判断程序的进程是在存在,是否已经启动成功!下面是实现代码。
介绍QProcess启动方式
- QProcess::execute(): 以阻塞的方式打开进程,当进程执行完后才会执行该进程后面的程序
- QProcess::start(): 以子进程的方式打开进程,与打开的进程有关系(父子关系)
- QProcess::startDetached(): 以隔离的方式打开进程,与打开它的进程无关系
实现代码
bool IsProcessExist(const QString &processName)
{
QProcess process;
process.start("tasklist");
process.waitForFinished();
QByteArray result = process.readAllStandardOutput();
QString str = result;
if(str.contains(processName))
return true;
else
return false;
}
使用示例
qDebug() << IsProcessExist("TIM.exe");
参数说明:进程实际执行的 exe名字 ,可以通过任务管理器的详细信息看见,以及程序安装目录可以找到,详情下图可以看见。
win32判断进程是否存在
#include <window.h>
#include "tlhelp32.h"
#include <string.h>
using namespace std;
//判断进程是否存在
BOOL IsExistProcess(const char* szProcessName)
{
PROCESSENTRY32 processEntry32;
HANDLE toolHelp32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (((int)toolHelp32Snapshot) != -1)
{
processEntry32.dwSize = sizeof(processEntry32);
if (Process32First(toolHelp32Snapshot, &processEntry32))
{
do
{
int iLen = 2 * wcslen(processEntry32.szExeFile);
char* chRtn = new char[iLen + 1];
//转换成功返回为非负值
wcstombs(chRtn, processEntry32.szExeFile, iLen + 1);
if (strcmp(szProcessName, chRtn) == 0)
{
return TRUE;
}
} while (Process32Next(toolHelp32Snapshot, &processEntry32));
}
CloseHandle(toolHelp32Snapshot);
}
//
return FALSE;
}
额外扩展,如何杀死进程
win32实现杀死进程
#include <window.h>
#include "tlhelp32.h"
#include <string.h>
using namespace std;
//通过进程名来杀死进程
int KillProcess(LPCSTR processName)
{
PROCESSENTRY32 pe;
DWORD id=0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hSnapshot,&pe))
{
return 0;
}
while(1)
{
pe.dwSize=sizeof(PROCESSENTRY32);
if(Process32Next(hSnapshot,&pe)==FALSE)
{
break;
}
//find processName
if(wcsicmp(pe.szExeFile, processName)==0)
{
id = pe.th32ProcessID;
break;
}
}
CloseHandle(hSnapshot);
//if(id == 0)
// return ;
//Kill The Process
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, id );
if (hProcess != NULL)
{
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
}
return 1;
}
QProcess结束进程
// 例如 notepad.exe 为需要关闭的进程名
QProcess p;
QString c = "taskkill /im notepad.exe /f";
p.execute(c);
p.close();
另外一种写法:
cmd 终止进程方式:
终止进程名为test.exe的进程
QStringList params;
params << "-f" << "-im" << "test.exe";
QProcess process;
process.start("taskkill",params);
备注cmd命令:
tasklist -fi “imagename eq test.exe” – 显示进程名为test.exe的进程信息
tasklist -fi “imagename ne test.exe” – 显示进程名不为test.exe的进程信息
tasklist -fi “pid eq 1958” – 显示进程号为1958的进程信息
taskkill -f -pid 1958 – 强制终止进程号为1958的进程
taskkill -f -im test.exe – 强制终止所有进程名为test.exe的进程树
taskkill -f -fi “imagename eq test.exe” –强制终止所有进程名为test.exe的进程树
如果觉得博主写的不错的话,就请博主喝杯咖啡☕吧!!!
以上是关于QT使用QProcess类,判断某个进程是否存在的主要内容,如果未能解决你的问题,请参考以下文章