如何使用Qt(C++)按名称检查程序是否正在运行

12

如何使用Qt(C++)检查程序是否正在运行,以其名称为标识。

QProcess::pid是否能够胜任这项工作?我不知道如何使用它。请建议。


2
只要您拥有该对象,此问题似乎符合您的需求。 - chris
是的,但我不知道如何使用QProcess :: state(),像这样吗?QProcess :: state(“chrome.exe”);? - Random78952
1
你可以通过某个函数获取进程名称的 QProcess 对象,然后在其上调用它。 - chris
你能举个例子吗?非常感谢你的回答 :) - Random78952
1
我想这个链接可能会有所帮助。我还没有看到通过Qt函数获取进程名称或获取所有正在运行的进程列表的任何内容。 - chris
如果您想查看特定程序是否正在运行,而不是从QProcess启动,我认为您无法在Qt中实现。但是,如果您告诉我们需要在哪些平台上工作,肯定有一种非便携式的方法可以实现。 - Dave Mateer
3个回答

21
据我所知,除非您自己生成了进程,否则QProcess不允许您这样做,实际上Qt中没有任何方法可以实现这一点。然而,Win32 API提供了一种通过EnumProcesses函数实现您想要的功能的方法,Microsoft网站提供了如何使用它的完整示例。

http://msdn.microsoft.com/en-us/library/ms682623.aspx

为了获取,您需要使用以下函数替换PrintProcessNameAndID:

bool matchProcessName( DWORD processID, std::string processName)
{
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );

    // Get the process name.

    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, 
                               sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }

    // Compare process name with your string        
    bool matchFound = !_tcscmp(szProcessName, processName.c_str() );

    // Release the handle to the process.    
    CloseHandle( hProcess );

    return matchFound;
}

1
+1来弥补被踩的原因;不确定为什么会被踩。我原本想在我的回复中包含同样页面的链接。这绝对是官方的做法。 - Dave Mateer

11

快速并且简单的方法是只需要检查tasklist的输出,就像这样:

bool isRunning(const QString &process) {
  QProcess tasklist;
  tasklist.start(
        "tasklist",
        QStringList() << "/NH" 
                      << "/FO" << "CSV" 
                      << "/FI" << QString("IMAGENAME eq %1").arg(process));
  tasklist.waitForFinished();
  QString output = tasklist.readAllStandardOutput();
  return output.startsWith(QString("\"%1").arg(process));
}

使用EnumProcesses可能是更好的方式(即更“纯粹”;当然更高效),但只要不在大循环或类似情况下调用,这种方法就足够好了。相同的思路也可以移植到其他平台上,尽管命令工具和解析逻辑显然会有所不同。


-3
 //How to Run App
 bool ok = QProcess::startDetached("C:\\TTEC\\CozxyLogger\\CozxyLogger.exe");
 qDebug() <<  "Run = " << ok;


 //How to Kill App
 system("taskkill /im CozxyLogger.exe /f");
 qDebug() << "Close";

在此输入图片描述


这不是回答“如何检查程序是否正在运行”的问题。但无论如何,感谢您的贡献。 - Willy K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接