How to check if a program is running by its name with Qt (C++)
Solution 1
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;
}
Solution 2
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.
Random78952
Updated on January 06, 2020Comments
-
Random78952 over 4 years
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. -
Dave Mateer over 11 years+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.
-
Willy K. about 5 yearsThis is not the answer to the question "How to check if a program is running.... But thanks for your input anyhow.