Russian Qt Forum

Qt => Общие вопросы => Тема начата: neosapient от Ноябрь 17, 2008, 15:41



Название: Как запустить программу, со скрытым окном, а затем закрыть программу?
Отправлено: neosapient от Ноябрь 17, 2008, 15:41
Добрый день.

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

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

Чем можно запустить программу, передать ей параметры, как в командной строке, скрыть окно до его активации?
Чем убить процесс?


Название: Re: Как запустить программу, со скрытым окном, а затем закрыть программу?
Отправлено: Rcus от Ноябрь 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. 


Название: Re: Как запустить программу, со скрытым окном, а затем закрыть программу?
Отправлено: neosapient от Ноябрь 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
...
}
Структуры локальные и доступа к ним невижу. Или есть рациональный вариант?


Название: Re: Как запустить программу, со скрытым окном, а затем закрыть программу?
Отправлено: Rcus от Ноябрь 17, 2008, 17:47
Не понял, о чем вы. Мне казалось вам нужен способ запустить приложение под Windows не показывая его, и кроссплатфоменность вас не волнует. То что я цитировал это не документация Qt, а Windows SDK.


Название: Re: Как запустить программу, со скрытым окном, а затем закрыть программу?
Отправлено: neosapient от Ноябрь 17, 2008, 18:33
Я понял, Вы всё верно ответили.
Просто я понадеялся, что есть готовый класс-оболочка.

Придется по старинке всё писать


Название: Re: Как запустить программу, со скрытым окном, а затем закрыть программу?
Отправлено: Danila_Bagrofff от Июль 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