Ответ 1
Вы смешиваете термины. "Консоль Windows" не является "cmd.exe", а специальным "сервисом", который реализовал, например, Win7, с помощью "conhost.exe".
Когда вы запускаете консольное приложение any (не имеет значения cmd, powershell или ваше собственное приложение), окна запускают его в специальной среде, которая может иметь видимое окно консоли. Но это всегда внутренняя консоль Windows.
Но! Консольные эмуляторы могут захватить это окно, скрыть настоящую консоль и отобразить собственную эмулируемую поверхность. Например, вы можете запустить ConEmu со специальными переключателями (описанными в SU, ссылка в комментарии) и его выполнение.
Замена терминала по умолчанию
ConEmu имеет функцию с именем Default Terminal
. Если вы включите эту функцию, вы сможете без проблем запускать свое приложение из Visual Studio на терминале ConEmu. Идея заключается в подключении CreateProcess в исходном приложении (explorer.exe
, vcexpress.exe
и т.д., Разделите их с помощью |
в настройках). Подробнее об этой функции читайте в вики проекта.
Вы можете использовать существующий экземпляр ConEmu или запустить новое окно для своего приложения. ConEmu может показать сообщение Press Enter or Esc to close console...
на консоли после выхода вашего приложения (радио Always
). Не нужно больше добавлять readline
в конце вашей программы, чтобы увидеть результат.
Изменение кода приложения
Поскольку это ваша собственная программа, вы можете добавить, например, следующие строки в начало вашей функции main
Пример С++
#ifdef _DEBUG
if (IsDebuggerPresent())
{
STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi = {};
if (CreateProcess(NULL,
_T("\"C:\\Program Files\\ConEmu\\ConEmu\\ConEmuC.exe\" /AUTOATTACH"),
NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
{ CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
}
#endif
Пример С#
#if DEBUG
ProcessStartInfo pi = new ProcessStartInfo(@"C:\Program Files\ConEmu\ConEmu\ConEmuC.exe", "/AUTOATTACH");
pi.CreateNoWindow = false;
pi.UseShellExecute = false;
Console.WriteLine("Press Enter after attach succeeded");
Process.Start(pi);
Console.ReadLine();
#endif