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类,判断某个进程是否存在的主要内容,如果未能解决你的问题,请参考以下文章

qt怎么查看当前正在执行的代码

QProcess的正确用法

C#winform 有关判断进程的问题

QT软件开发: QProcess启动进程完成交互并获取输出

如何确定在 Linux 上使用 Qt4 终止 QProcess 的信号?

QProcess 终止进程树