Как выполнить дочерние консольные программы, не показывая окно консоли из программы Win32 GUI? - PullRequest
11 голосов
/ 20 января 2011

(Я искал ответы SO и не нашел четкого решения этой проблемы.)

Я работаю над программой MFC GUI.Эта программа запускает различные дочерние программы, включая консольную программу и командный сценарий оболочки (.cmd).

Изначально она отображала одно окно графического интерфейса пользователя и одно окно консоли (созданное с помощью AllocConsole), потому что от дочернего элемента было много выходных данных консолипроцессы.Но многие пользователи жаловались на окно консоли, поэтому мы решили скрыть окно консоли.

Сначала попробовали, как показано ниже:

if (AllocConsole())
{
    ::ShowWindow(::GetConsoleWindow(), SW_HIDE);
}

Хорошо, нет окна консоли, но на консоли видны мерцаниявремя создания.Я попробовал несколько вариантов CreateProcess для создания дочерних процессов, чтобы вообще не показывать окно консоли, но не смог, и я думаю, что это практически невозможно.

Это не так уж важно.Мы можем игнорировать временное мерцание окна при запуске.

Но действительно ли невозможно полностью скрыть дочернее окно консоли?

1 Ответ

15 голосов
/ 20 января 2011

Установите STARTUPINFO следующим образом для вызова CreateProcess:

    STARTUPINFO si = { 0 };
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    si.hStdOutput =  GetStdHandle(STD_OUTPUT_HANDLE);
    si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
    si.wShowWindow = SW_HIDE;
...