Как выполнить программы дочерних консолей, не показывая окно консоли из программы Win32 GUI?
(Я искал ответы SO и не нашел четкого решения этой проблемы.)
Я работаю над программой MFC GUI. Эта программа запускает различные дочерние программы, включая консольную программу и команду оболочки script (. Cmd).
Первоначально он отображал одно окно GUI и одно консольное окно (созданное с помощью AllocConsole
), потому что из дочерних процессов имеется много консольных выходов. Но многие пользователи жаловались на консольное окно, поэтому мы решили скрыть окно консоли.
Сначала попробовали, как показано ниже:
if (AllocConsole())
{
::ShowWindow(::GetConsoleWindow(), SW_HIDE);
}
Хорошо, нет окна консоли, но есть видимое мерцание во время создания консоли.
Я попробовал несколько опций CreateProcess
для создания дочерних процессов, чтобы предотвратить показ окна консоли вообще, но не удалось на короткое время, и я думаю, что это практически невозможно.
Это неважно. Мы можем игнорировать временное мерцание окна при запуске.
Но действительно ли невозможно полностью скрыть дочернее консольное окно?
Ответы
Ответ 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;