方法1 调用“tasklist”,检测是否包含进程名称。 缺点:可能会阻塞一小会儿,导致界面卡顿。 主要是在waitForFinished上阻塞, readAllStandardOutput也会有所耗时。
QProcess tasklist;
tasklist.start(
"tasklist",
QStringList() << "/NH"
<< "/FO" << "CSV"
<< "/FI" << QString("IMAGENAME eq 进程名称.exe"));
if ( tasklist.waitForFinished() )
{
QByteArray result = tasklist.readAllStandardOutput();
QString result1 = TOCH(result.constData());
if (result1.contains("进程名称.exe", Qt::CaseInsensitive))
{
return true;
}
}
else
{// 失败
qDebug() << "tasklist failed error="
<< tasklist.error()
<< tasklist.errorString();
}
方法二 代码繁琐 但是不卡界面。
QProcess process;
process.start("tasklist");
bool bFinished = false; //进程是否结束
bool bResult = false; //检测结果
QObject::connect(&process,static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished),
[&](int nExitCode, QProcess::ExitStatus exitStatus)
{// 匿名函数 进程结束后会被调用
if (nExitCode == 0)
{
QByteArray result = process.readAllStandardOutput();
QString result1 = TOCH(result.constData());
if (result1.contains("进程名称.exe", Qt::CaseInsensitive))
{
bResult = true;
}
}
bFinished = true; // 引用传值 这里改变值 外面的变量本身也会被改变
});
//启动进程
process.start();
QTimer t;
t.start();
while(t.elapsed() < 250)
{ // 在等待进程执行的过程中 处理界面事件 避免卡顿
QCoreApplication::processEvents();
}
process.disconnect(); // 保险起见 取消所有信号连接
if (!bResult)
{// todo
}