grig_p09 жовтня 2017 р. 04:37
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);
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
AD
- Akiv Doros
- 11 листопада 2024 р. 22:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
m
- molni99
- 26 жовтня 2024 р. 08:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
m
- molni99
- 26 жовтня 2024 р. 08:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Останні коментарі
ИМ
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь Максимов22 листопада 2024 р. 19:51
Evgenii Legotckoi31 жовтня 2024 р. 21:37
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов05 жовтня 2024 р. 14:51
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi24 червня 2024 р. 22:11
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey115 листопада 2024 р. 14:04
NSProject04 червня 2022 р. 10:49
IscanderChe31 жовтня 2024 р. 22:43
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
Добрый день!
Я сейчас мало работаю с WinAPI , но могу предположить, что неработоспособность функции FindWindow заключается в кодировке. Скорее всего нужно передать массив символов в кодировке cp1251 , а там передаётся что-то другое.
Спасибо большое!
С Вашей подсказкой получилось.
Вот код:
Пожалуйста.
Спасибо.
А как это сделать?
Если есть желание, то можете оставлять заметки на сайте в виде статей, это может быть всего несколько абзацев о какой-нибудь полезняшке в программировании.
Написал.
Прошу прощения за задержку:
https://evileg.com/post/295/
Круто)) Спасибо
Если вдруг ещё будут полезные идеи, то ждёмс. Но один момент на заметку. Для отделения текста, который виден в ленте новостей от остального текста, который виден на странице статьи используйте "Вставку горизонтальной линии" Она выступает в качестве разделителя.