Russian Qt Forum
Октябрь 01, 2024, 20:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как запустить программу, со скрытым окном, а затем закрыть программу?  (Прочитано 7221 раз)
neosapient
Гость
« : Ноябрь 17, 2008, 15:41 »

Добрый день.

Требуется запустить набор программ, при этом надо передать через командную строку параметры запуска и запретить показывать окно.
Дать программам поработать и через некоторое время убить процесс.

Делаю под Windows.
Если запускать через CreateProcess  (аля QProcess), то не получается скрыть запускающееся окно. Зато можно вызвать TerminateProcess.
Если задействовать ShellExecute (аля QDesktopServices), то можно передать SW_HIDE. Но тогда как убить открывающееся окно?

Чем можно запустить программу, передать ей параметры, как в командной строке, скрыть окно до его активации?
Чем убить процесс?
Записан
Rcus
Гость
« Ответ #1 : Ноябрь 17, 2008, 15:53 »

В CreateProcess предпоследний параметр
Цитировать
pStartupInfo

Points to a STARTUPINFO structure that specifies how the main window for the new process should appear.

STARTUPINFO
Цитировать
wShowWindow

Ignored unless dwFlags specifies STARTF_USESHOWWINDOW. The wshowWindow member can be any of the SW_ constants defined in WINUSER.H. For GUI processes, wShowWindow specifies the default value the first time ShowWindow is called. The nCmdShow parameter of ShowWindow is ignored. In subsequent calls to ShowWindow, the wShowWindow member is used if the nCmdShow parameter of ShowWindow is set to SW_SHOWDEFAULT. 
Записан
neosapient
Гость
« Ответ #2 : Ноябрь 17, 2008, 16:13 »

Вот только плохо, что нет инициализации этой структуры.
qprocess_win.cpp
Код:

void QProcessPrivate::startProcess()
{
...
#else
        dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
        STARTUPINFOW startupInfo = { sizeof( STARTUPINFO ), 0, 0, 0,
                                 (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT,
                                         (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT,
                                         0, 0, 0,
                                         STARTF_USESTDHANDLES,
                                         0, 0, 0,
                                         stdinChannel.pipe[0], stdoutChannel.pipe[1], stderrChannel.pipe[1]
        };
        success = CreateProcessW(0, (WCHAR*)args.utf16(),
                                 0, 0, TRUE, dwCreationFlags,
                                 environment.isEmpty() ? 0 : envlist.data(),
                                 workingDirectory.isEmpty() ? 0
                                    : (WCHAR*)QDir::toNativeSeparators(workingDirectory).utf16(),
                                 &startupInfo, pid);
#endif
    } else
#endif // UNICODE
    {
#ifndef Q_OS_WINCE
    STARTUPINFOA startupInfo = { sizeof( STARTUPINFOA ), 0, 0, 0,
                                         (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT,
                                         (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT,
                                         0, 0, 0,
                                         STARTF_USESTDHANDLES,
                                         0, 0, 0,
                                         stdinChannel.pipe[0], stdoutChannel.pipe[1], stderrChannel.pipe[1]
    };

    success = CreateProcessA(0, args.toLocal8Bit().data(),
                                     0, 0, TRUE, dwCreationFlags, environment.isEmpty() ? 0 : envlist.data(),
                                     workingDirectory.isEmpty() ? 0
                                        : QDir::toNativeSeparators(workingDirectory).toLocal8Bit().data(),
                                     &startupInfo, pid);
#endif // Q_OS_WINCE
...
}
Структуры локальные и доступа к ним невижу. Или есть рациональный вариант?
Записан
Rcus
Гость
« Ответ #3 : Ноябрь 17, 2008, 17:47 »

Не понял, о чем вы. Мне казалось вам нужен способ запустить приложение под Windows не показывая его, и кроссплатфоменность вас не волнует. То что я цитировал это не документация Qt, а Windows SDK.
Записан
neosapient
Гость
« Ответ #4 : Ноябрь 17, 2008, 18:33 »

Я понял, Вы всё верно ответили.
Просто я понадеялся, что есть готовый класс-оболочка.

Придется по старинке всё писать
Записан
Danila_Bagrofff
Гость
« Ответ #5 : Июль 01, 2011, 17:41 »

Как скрыть:
Код:
QString hidec = QApplication::applicationDirPath() +"/hidec.exe"; //про hidec отдельно
    QStringList str;
    str << exw_path;  //запускаемый скрытым экзешник
    str << filePath; //запускаемый в том экзешнике файл
    QProcess::startDetached(hidec, str);

Убиваю через: taskkill, /? в помощь =)

Про hidec написано здесь: http://www.prog.org.ru/index.php?topic=12884.msg82817#msg82817
« Последнее редактирование: Июль 01, 2011, 18:03 от Danila_Bagrofff » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 20.