c# - 从控制台应用程序(C#/ WinForms)发送输入/获取输出

我有一个带有3个控件的表单:


供用户输入的文本框
发送到控制台的命令
应用,
确认命令的按钮
被发送和
一个只读文本框,用于显示
应用程序的输出。


我想要的是让用户在第一个文本框中输入命令,按下按钮以通过第二个文本框输入和接收反馈。

我知道如何使用ProcessStartInfo.RedirectStandardOutput,但是,当我使用StandardOutput.ReadToEnd()时,应用程序挂起。

我看了一下异步Process.BeginOutputReadLine(),但是,即使我的应用程序没有挂起,在某种程度上,我在文本框中也没有任何响应,但它绝对不起作用。

这是我的代码:

public partial class MainForm : Form
{

    private void MainForm_Load(object sender, EventArgs e)
    {
        InitializeInterpreter();
    }

    private void InitializeInterpreter()
    {
        InterProc.StartInfo.UseShellExecute = false;
        InterProc.StartInfo.FileName = "app.exe";
        InterProc.StartInfo.RedirectStandardInput = true;
        InterProc.StartInfo.RedirectStandardOutput = true;
        InterProc.StartInfo.RedirectStandardError = true;
        InterProc.StartInfo.CreateNoWindow = true;
        InterProc.OutputDataReceived += new DataReceivedEventHandler(InterProcOutputHandler);

        InterProc.Start();
    }

    private static void InterProcOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        if (!String.IsNullOrEmpty(outLine.Data))
        {
           OutputTextBox.Append(Environment.NewLine + outLine.Data);
        }
    }

    private void Enterbutton_Click(object sender, EventArgs e)
    {
        InterProc.StandardInput.Write(CommandtextBox.Text);
        InterProc.BeginOutputReadLine();
    }
}


有什么办法可以让我顺利进行吗?谢谢。

最佳答案

如果您想进行交互,则可以使用此代码(您修改了这些内容,以下是有关修改的详细信息)

    private void InitializeInterpreter()
    {
        InterProc.StartInfo.UseShellExecute = false;
        InterProc.StartInfo.FileName = "Echoer.exe";
        InterProc.StartInfo.RedirectStandardInput = true;
        InterProc.StartInfo.RedirectStandardOutput = true;
        InterProc.StartInfo.RedirectStandardError = true;
        InterProc.StartInfo.CreateNoWindow = true;
        InterProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        InterProc.OutputDataReceived += new DataReceivedEventHandler(InterProcOutputHandler);

        bool started = InterProc.Start();

        InterProc.BeginOutputReadLine();

    }

    private void AppendTextInBox(TextBox box, string text)
    {
        if (this.InvokeRequired)
        {
            this.Invoke((Action<TextBox, string>)AppendTextInBox, OutputTextBox, text);
        }
        else
        {
            box.Text += text;
        }
    }

    private void InterProcOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        AppendTextInBox(OutputTextBox, outLine.Data + Environment.NewLine);
    }

    private void Enterbutton_Click(object sender, EventArgs e)
    {
        InterProc.StandardInput.WriteLine(CommandTextBox.Text);
    }


因此,在过程开始后,我将BeginOutputReadLine移到了。这样可以确保它仅被调用一次。我还执行了清理线程调用所需的调用。希望这对您有用。

本文翻译自 https://stackoverflow.com/questions/1765493/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# processstartinfo redirectstandardoutput


相关文章:

c# - .net十进制值1m和1.0000m之间有什么实际区别?

c# - .NET - WindowStyle = hidden与CreateNoWindow = true?

c# - 从C#中运行安装程序

c# - 阅读StandardOutput问题

c# - 为什么不能在C#中使用Process获得C ++程序的输出?

c# - Visual Studio 2010错误:“调用目标已引发异常”

c# - MvvmLight RaisePropertyChanged(“”)

c# - C#关闭标准输出

c# - ListView FocusedItem变为NULL

c# - 我如何获得构建/重建实时输出