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.
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.
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;
}
Cura di commentare il downvote? – jaho
+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. –
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.
//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";
[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
Sì, ma non so come usare QProcess :: state(), in questo modo? QProcess :: Stato ("chrome.exe"); ?? – Random78952
Probabilmente si può ottenere un oggetto 'QProcess' con il nome del processo usando una funzione e poi chiamarlo su quello. – chris