一、概述
本文将介绍通过QProcess类实现对外部应用程序是否已经启动的判断、启动和关闭。
二、判断外部程序是否已经启动
Qt在windows下实际上是通过QProcess对象启动windows自带的tasklist程序来读取正在系统中运行的所有程序的信息(其中包括了程序名等等),然后通过比较读取出来的所有信息中是否包含有我们想要判断的程序的程序名来实现的,如下代码中,在start函数的第一个参数是应用程序名,第二个参数是参数一程序启动时输入的启动参数,/FI表示利用其后的条件筛选出所有符合条件的进程信息,imagename eq appName 表示匹配所有字符串为appName的信息。完整参数为 /FI imagename eq appName,表示筛选出包含有appName字符串的所有进程。(对于tasklist不多做介绍,百度上有很多详细的介绍)
bool CheckAppStatus(const QString &appName)
{
#ifdef Q_OS_WIN //表示如果在windows下
QProcess process;
process.start("tasklist" ,QStringList()<<"/FI"<<"imagename eq " +appName); //执行tasklist程序
process.waitForFinished(5000); //阻塞5秒等待tasklist程序执行完成,超过五秒则直接返回
QString outputStr = QString::fromLocal8Bit(process.readAllStandardOutput()); //把tasklist程序读取到的进程信息输出到字符串中
if(outputStr.contains(appName))
{
process.close() //用完记得把process关闭了,否则如果重新调用这个函数可以会失败
return true;
}
else
{
process.close();
return false;
}
#endif
}
三、启动程序
QProcess类提供了三个函数来启动外部程序,分别是start、startDetached和execute。这三个函数都能启动外部程序,但是也有其相应的区别:
start :此函数启动的外部程序会跟随我们的程序退出而退出,这个函数在前面的检测程序是否已经启动的例子已经用到过。
startDetached:此函数启动外部程序后该程序就跟我们的程序没关系了,它的父进程是系统进程,所以我们程序退出,外部程序还会继续运行。
execute:此函数执行后会发生阻塞直到函数返回,这个适合需要得到返回结果才能进一步处理的场景使用,这个会在后面关闭外部程序中介绍到
代码实现例子:
startApp(const QString&name) //name可以是程序名也可以程序所在的完整路径(如:C:\myapp.exe)
{
#ifdef Q_OS_WIN
QProcess process;
process.startDetached(QString("\"%1\"").arg(name));
process.close();
#endif
}
四、关闭外部程序
关闭程序也是调用了windows自带的taskkill程序来关闭的,其中/f表示强制终止,/im表示指定的进程名(更多参数去百度啦)
直接上代码:
void killApp(const QString& appName)
{
#ifdef Q_OS_WIN
QProcess process;
QString command="taskkill /im" + appName + "/f";
process.execute(command); //execute执行后会一直阻塞到返回外部程序退出的代码,比如无法关闭会返回-2
process.close();
#endif
}