我正在Windows窗口中运行命令行进程,并重定向stdin / stdout / stderr。该过程可能是交互式的,因此我需要将键盘输入传递给它。我这样做是将类型化的字节写入流程“StandardInput
,AutoFlush=true
。
我正在测试cmd.exe。我可以看到cmd接收输入 - 如果我输入“dir [Enter]”,命令将按预期执行。这些字符在输入时完全传递给StandardInput,我已经检查过了。
然而,这是奇怪的:当我按Enter键时,键入的字符只会回显到进程'stdout。
这看起来像一个刷新问题,但我无法修改cmd的行为;我不能强迫它在每个字节后刷新。
这是KeyPressed处理程序:
Process m_Proc;
//...
private void OnConsoleKey(object sender, KeyPressEventArgs e)
{
if (m_Proc != null && !m_Proc.HasExited)
{
char c = e.KeyChar;
if (c == '\r')
m_Proc.StandardInput.Write("\r\n"); //Enter key delivered as CR, no LF
else
m_Proc.StandardInput.Write(c);
m_Proc.StandardInput.Flush();
}
}
我在每个字节的基础上处理stdout,而不是按行进行处理,如下所示:
m_Proc.Start();
new Thread(StreamReaderProc).Start(m_Proc.StandardOutput);
//...
private void StreamReaderProc(object o)
{
StreamReader sr = o as StreamReader;
for (; ; )
{
int c = sr.Read();
if (c == -1) //End of file - that means the process quit
break;
else
BeginInvoke(new Action<char>(LogChar), (char)c); //Can't modify the log contents from a worker thread
}
}
知道这里有什么问题吗?