13

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

Will QProcess::pid do the job? I don't know how to use it. Please suggest.

6
  • 2
    This question seems to fit your needs as long as you have the object. Commented Nov 29, 2012 at 20:08
  • Yes, but i don't know how to use QProcess::state(), like that ? QProcess::state("chrome.exe"); ?? Commented Nov 29, 2012 at 20:10
  • 1
    Presumably you can get a QProcess object by the process name using some function and then call it on that. Commented Nov 29, 2012 at 20:12
  • Can you give an exemple please ? and thanks you very much for yours answers :) Commented Nov 29, 2012 at 20:15
  • 1
    This could help, I guess. I haven't seen anything to get a process by name or to get a list of all running processes through use of a Qt function. Commented Nov 29, 2012 at 20:18

4 Answers 4

21

As far as I know QProcess won't allow you to do that (unless you've spawned the process yourself) and in fact nothing in Qt will. However Win32 API provides a way to achieve what you want through EnumProcesses function and a complete example of how to use it is provided at Microsoft website:

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

To get you need replace PrintProcessNameAndID with the following function:

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; } 
Sign up to request clarification or add additional context in comments.

1 Comment

+1 to compensate for the downvote; not sure why this was downvoted. I was going to include a link to the same page in my response. This is certainly the official way to do it.
11

A quick and dirty way to do it would be to just check the output of tasklist, something like:

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

Using EnumProcesses is probably a better way (i.e. more "pure"; certainly more performant), but this may be "good enough" as long as this isn't being called in a big loop or something. The same idea could also be ported to other platforms as well, although obviously the command tool and parsing logic would be different.

Comments

0

pid() is obsolete. Here is the statement from Qt

"This function is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code. Use processId() instead. Returns the native process identifier for the running process, if available. If no process is currently running, 0 is returned."

Sorry, the following code is for me to find the process ID based on the process name. However, you can use it to check if a process is still running. I hope this help.

QProcess theProcess; QString theProgramm("pgrep") // or pidof, or any system commands you prefer. QStringList theArgument = QStringList() << processName // processName must be QString QByteArray theOutput theProcess.start(theProgram, theArgument); theProcess.waitForReadyRead(); theOutput = theprocess.readAllStandardOutput(); theProcess.terminated(); theProcess.waitForFinished(); theProcess.kill(); return (theOutput.isEmpty()) ? false : true; 

Comments

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

Screenshot:
enter image description here

1 Comment

This is not the answer to the question "How to check if a program is running.... But thanks for your input anyhow.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.