Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 887
Random78952 Avatar asked Nov 29 '12 20:11

Random78952


People also ask

Is Qt written in C?

Short answer: no. If you need a comprehensive GUI toolkit for C, you can use GTK+. To use Qt, you must have a C++ compiler. But it doesn't mean that your "application logic" can't be written in C, compiled with a C compiler and carefully linked to the C++ part (the GUI with Qt).

Is Qt only for C++?

While the Qt framework is C++ based, you can also code with QML and JavaScript. In fact, you can create full apps without even touching C++.


2 Answers

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.

like image 120
Dave Mateer Avatar answered Oct 04 '22 21:10

Dave Mateer


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;
}
like image 27
jaho Avatar answered Oct 04 '22 20:10

jaho