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

Posted

技术标签:

【中文标题】如何使用 Qt (C++) 检查程序是不是按其名称运行【英文标题】:How to check if a program is running by its name with Qt (C++)如何使用 Qt (C++) 检查程序是否按其名称运行 【发布时间】:2012-11-29 20:05:17 【问题描述】:

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

QProcess::pid 会做这项工作吗?我不知道如何使用它。请提出建议。

【问题讨论】:

This question 似乎符合您的需求,只要您有对象。 是的,但我不知道如何使用 QProcess::state(),像那样? QProcess::state("chrome.exe"); ?? 大概你可以使用某个函数通过进程名称获取QProcess 对象,然后调用它。 你能举个例子吗?非常感谢你的回答:) This 可能会有所帮助,我猜。我还没有看到通过名称获取进程或通过使用 Qt 函数获取所有正在运行的进程的列表。 【参考方案1】:

据我所知,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 以补偿反对票;不知道为什么这被否决了。我打算在我的回复中包含指向同一页面的链接。这当然是官方的做法。【参考方案2】:

一种快速而肮脏的方法是只检查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";

enter image description here

【讨论】:

这不是问题“如何检查程序是否正在运行...的答案。但无论如何感谢您的输入。

以上是关于如何使用 Qt (C++) 检查程序是不是按其名称运行的主要内容,如果未能解决你的问题,请参考以下文章

如果数据库可访问,如何快速检查? (Qt、QML、C++)- Linux

如何使用 C++ 检查进程是不是正在运行

如何检查 GUI 应用程序是不是在 Ubuntu 上运行?

C++ Qt - 检查蒸汽游戏是不是正在以编程方式运行

按其值将任何结构字段名称转换为字符串

Qt / C++ - 如何存储配置数据