2012-11-29 53 views
9

如何使用Qt(C++)檢查程序是否按名稱運行。如何使用Qt(C++)檢查程序是否按名稱運行

請問QProcess::pid工作嗎?我不知道如何使用它。請建議。

+2

[這個問題](http://stackoverflow.com/questions/10422145/how-to-check-if-a-process-is-running-or-not)似乎只要你有對象,就適合你的需求。 – chris

+0

是的,但我不知道如何使用QProcess :: state(),那樣?另外,QProcess ::狀態( 「的chrome.exe」); ?? – Random78952

+1

大概你可以通過使用某個函數的進程名來獲得一個'QProcess'對象,然後調用它。 – chris

回答

16

據我所知,QProcess不會允許你這樣做(除非你自己催生了這個過程),事實上Qt中沒有任何東西。但是的Win32 API提供一種方式來實現你想要通過EnumProcesses功能和如何使用它在微軟網站提供了一個完整的例子是什麼:

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; 
} 
+0

關注downvote的評論? – jaho

+1

+1來補償downvote;不知道爲什麼這是downvoted。我將在我的回覆中包含指向同一頁面的鏈接。這當然是官方的做法。 –

8

一個快速和骯髒的方式做到這一點是隻檢查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可能是一種更好的方法(即,更「純」的;當然更高性能),但是這可能是「足夠好」,只要這不是在大循環或什麼東西中被調用。同樣的想法也可以移植到其他平臺上,但顯然命令工具和解析邏輯會有所不同。

0
//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

相關問題