grig_p
grig_p31 жовтня 2017 р. 04:27

Qt - WinAPI. Як показати запущену програму поверх вашої програми

Виникла у мене якось завдання керувати програмами - сервісами, написаними на 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);
}
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Юрий
  • 16 червня 2018 р. 11:19

А можно по ID процесса  выводить на передний план окно?

myProcess->processId();
Evgenii Legotckoi
  • 18 червня 2018 р. 03:00

Если зарыться в API системы, то, думаю, что можно, тут тоже использовался WinAPI.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах