grig_pOct. 9, 2017, 4:37 a.m.
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. Она не возвращает корректный хэндл. Хотя окно есть.
Я написал небольшую консольную программу на Delphi, используя эти же вызовы. Она работает и показывает нужное окно. Вот ее код:
program BTFArmAdmin; {$APPTYPE CONSOLE} uses Windows, SysUtils; const WinCaption = 'Заголовок окна'; var hWndArm : hwnd; begin try hWndArm := FindWindow(nil, WinCaption); if hWndArm > 0 then begin ShowWindow(hWndArm, SW_RESTORE); SetForegroundWindow(hWndArm); end; except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; end.Вот эту программу я вызываю из главной программы Qt для показа окна.
Но это некрасиво.
Как сделать так, чтобы это работало из Qt? Что не так у меня в коде?
Заранее очень благодарен за ответ!
Пробовал делать так, но все равно не работает:
Q_PID pi = app->pid(); ShowWindow((HWND)pi->hProcess, SW_RESTORE); SetForegroundWindow((HWND)pi->hProcess);
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
d
- dsfs
- April 26, 2024, 2:56 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
d
- dsfs
- April 26, 2024, 2:35 p.m.
C++ - Test 001. The first program and data types
- Result:73points,
- Rating points1
Last comments
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий КононенкоFeb. 5, 2024, 12:50 p.m.
EVADec. 25, 2023, 9:30 p.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
Evgenii LegotckoiMay 3, 2024, 12:07 a.m.
IscanderCheApril 30, 2024, 2:22 p.m.
Павел ДорофеевApril 14, 2024, 12:35 p.m.
Добрый день!
Я сейчас мало работаю с WinAPI , но могу предположить, что неработоспособность функции FindWindow заключается в кодировке. Скорее всего нужно передать массив символов в кодировке cp1251 , а там передаётся что-то другое.
Спасибо большое!
С Вашей подсказкой получилось.
Вот код:
Пожалуйста.
Спасибо.
А как это сделать?
Если есть желание, то можете оставлять заметки на сайте в виде статей, это может быть всего несколько абзацев о какой-нибудь полезняшке в программировании.
Написал.
Прошу прощения за задержку:
https://evileg.com/post/295/
Круто)) Спасибо
Если вдруг ещё будут полезные идеи, то ждёмс. Но один момент на заметку. Для отделения текста, который виден в ленте новостей от остального текста, который виден на странице статьи используйте "Вставку горизонтальной линии" Она выступает в качестве разделителя.