2012-11-29 16 views
9

Come verificare se un programma è in esecuzione, con il suo nome, con Qt (C++).Come verificare se un programma è in esecuzione con il suo nome con Qt (C++)

QProcess::pid fare il lavoro? Non so come usarlo Si prega di suggerire.

+2

[Questa domanda] (http://stackoverflow.com/questions/10422145/how-to-check-if-a-process-is-running-or-not) sembra adatta alle tue esigenze finché hai l'oggetto. – chris

+0

Sì, ma non so come usare QProcess :: state(), in questo modo? QProcess :: Stato ("chrome.exe"); ?? – Random78952

+1

Probabilmente si può ottenere un oggetto 'QProcess' con il nome del processo usando una funzione e poi chiamarlo su quello. – chris

risposta

16

Per quanto ne so QProcess non ti permetterà di farlo (a meno che tu non abbia generato il processo tu stesso) e in effetti nulla in Qt lo farà. Tuttavia Win32 API fornisce un modo per ottenere quello che vuoi attraverso EnumProcesses funzione ed un esempio completo di come usarlo è fornita sul sito web Microsoft:

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

Per ottenere risultati è necessario sostituire PrintProcessNameAndID con la seguente funzione:

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

Cura di commentare il downvote? – jaho

+1

+1 per compensare il downvote; non so perché questo è stato downvoted. Stavo per includere un link alla stessa pagina nella mia risposta. Questo è certamente il modo ufficiale per farlo. –

8

Un modo rapido e sporco per farlo sarebbe quello di controllare solo l'output di tasklist, qualcosa come:

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)); 
} 

L'utilizzo di EnumProcesses è probabilmente un modo migliore (ad es. più "puro"; sicuramente più performante), ma questo può essere "abbastanza buono" purché non venga chiamato in un loop o qualcosa del genere. La stessa idea potrebbe anche essere portata su altre piattaforme, anche se ovviamente lo strumento di comando e la logica di analisi sarebbero diversi.

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

Problemi correlati