Irgendwie hatte ich die Aufgabe, Anwendungen zu verwalten - Dienste, die in Qt geschrieben wurden, von einer Anwendung - dem Kern, der ebenfalls in Qt geschrieben war. Darüber hinaus sollte die Dienstanwendung, wenn sie nicht läuft, gestartet werden, und wenn dies der Fall ist, sollte ihr Fenster in den Vordergrund gebracht werden. QProcess wird verwendet, um Anwendungen aufzurufen.
Es sieht aus wie das.
Prozesserstellung:
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())); }
Forderung:
if (!pw) { //Если приложение не запущено, то запустим его app->start(QIODevice::ReadOnly); } else { // Если запущено, то покажем его сверху HWND hWnd = FindWindow(nullptr, L"Заголовок главного окна"); if (hWnd > 0){ ShowWindow(hWnd, SW_RESTORE); SetForegroundWindow(hWnd); } }
Schlüssel:
void onProcStarted() { pw = true; } void onProcFinished(int) { pw = false; }
So wie ich es verstehe, weiß QProcess nicht, wie man das Fenster eines laufenden Prozesses in den Vordergrund bringt. Daher muss auf die WinApi zurückgegriffen werden. Das Anzeigen des Fensters in dieser Form funktioniert jedoch nicht. Außerdem funktioniert die FindWindow-Funktion nicht. Es gibt nicht das richtige Handle zurück. Obwohl es ein Fenster gibt.
Die Lösung bezog sich auf die direkte Angabe der Codierung wie folgt:
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.