Возникла у меня как-то задача управлять приложениями - сервисами, написанными на Qt, из приложения - ядра, написанного также на Qt. Причем, если приложение сервис не запущено, то оно должно запускаться, а если запущено, его окно должно выводиться на передний план. Для вызова приложений используется QProcess.
Выглядит это следующим образом.
Создание процесса:
QProcess *app; bool pw = false; ... void createProcess() { app = new QProcess(this); app->setProgram("MyProgram.exe"); app->setArguments(QStringList() << "arg1" << "arg2"); connect(app, SIGNAL(started()), this, SLOT(onProcStarted())); connect(app, SIGNAL(finished()), this, SLOT(onProcFinished())); }
Вызов:
if (!pw) { //Если приложение не запущено, то запустим его app->start(QIODevice::ReadOnly); } else { // Если запущено, то покажем его сверху HWND hWnd = FindWindow(nullptr, L"Заголовок главного окна"); if (hWnd > 0){ ShowWindow(hWnd, SW_RESTORE); SetForegroundWindow(hWnd); } }
Слоты:
void onProcStarted() { pw = true; } void onProcFinished(int) { pw = false; }
Как я понял, QProcess не умеет выводить на передний план окно запущенного процесса. Поэтому приходится прибегать к WinApi. Но показ окна в таком виде не работает. Причем, не работает функция FindWindow. Она не возвращает корректный хэндл. Хотя окно есть.
Решение было связано с прямым указанием кодировки следующим образом:
QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QString s = codec->toUnicode("Заголовок главного окна"); LPCWSTR lps = (LPCWSTR)s.utf16(); HWND hWnd = FindWindow(nullptr, lps); if (hWnd > 0) { ShowWindow(hWnd, SW_RESTORE); SetForegroundWindow(hWnd); }
А можно по ID процесса выводить на передний план окно?
Если зарыться в API системы, то, думаю, что можно, тут тоже использовался WinAPI.