Я не знаю ни одного способа использования ReadKey()
при перенаправлении StdIn / StdOut консольной программы. Кроме того, для чтения и записи из дочернего процесса необходимо убедиться, что вы используете Console.Out.Write()
/ Console.In.Read()
, чтобы исключить исключение из дочернего процесса, поскольку в нем отсутствует консольное окно.
Вы можете использовать Convert.ToChar(ExeOutput.Read())
для преобразования ввода в действительное KeyChar
, имитируя поведение ReadKey()
Также имейте в виду, Синхронные против Асинхронных операций чтения / записи. Если вы используете BeginOutputReadLine()
и читаете поток асинхронно, ваше условие while для P2.HasExited может стать истинным, прежде чем вы прочитаете все клавиши ввода при использовании ExeOutput.Read()
.....
P2.Start();
StreamWriter ExeInput = P2.StandardInput;
StreamReader ExeOutput = P2.StandardOutput;
do
{
var k = P2.StandardOutput.Read();
var key = Convert.ToChar(k);
if (key == Convert.ToChar(ConsoleKey.Enter))
{
Console.WriteLine();
ExeInput.Write("\n");
}
else
ExeInput.Write(key);
} while (!P2.HasExited);
....
К счастью, потоки будут буферизованы, если процесс завершился до того, как вы прочитали каждую строку, поэтому вы можете рассмотреть возможность изменения условия на while(!P2.HasExited && !P2.StandardOutput.EndOfStream)
, если это соответствует тому, что вы пытаетесь выполнить.