Подтвердить что ты не робот

Как выполнить программы дочерних консолей, не показывая окно консоли из программы Win32 GUI?

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Настройте 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;