在模拟控制台中,仅在输入

时间:2015-08-13 21:24:10

标签: c# .net-4.0 console console-application windows-console

我正在Windows窗口中运行命令行进程,并重定向stdin / stdout / stderr。该过程可能是交互式的,因此我需要将键盘输入传递给它。我这样做是将类型化的字节写入流程“StandardInputAutoFlush=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
        }
    }

知道这里有什么问题吗?

0 个答案:

没有答案