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

How to check if a program is running by its name with Qt (C++)

本文关键字:运行 是否 检查程序 Qt 何使用 C++      更新时间:2023-10-16

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

QProcess::pid能胜任这项工作吗?我不知道如何使用它。请指教。

据我所知,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;
}

一种快速而肮脏的方法是检查 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 可能是一种更好的方法(即更"纯粹";当然性能更高),但这可能"足够好",只要它不是在一个大循环或其他什么中调用的。同样的想法也可以移植到其他平台,尽管显然命令工具和解析逻辑会有所不同。

 //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";

在此处输入图像描述