Виникла у мене якось завдання керувати програмами - сервісами, написаними на 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.