当需要输入时,OutputDataReceived停止

时间:2016-12-22 13:48:01

标签: c#

我使用OutputDataReceived打印RichTextBox中进程的输出。有时,进程需要一些用户输入,我无法处理我的条件,因为用户需要在同一行输入输入,而不是新行,因此条件永远不会启动,程序停止等待输入

public ASFProcess(ASFui asf, RichTextBox rtb)
{
    _asf = asf;
    ASF = new Process();
    output = rtb;

    var ASFInfo = new ProcessStartInfo()
    {
        Arguments = "--server",
        CreateNoWindow = true,
        Domain = "",
        FileName = Properties.Settings.Default.ASFBinary,
        LoadUserProfile = false,
        Password = null,
        RedirectStandardError = true,
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
        StandardErrorEncoding = Encoding.UTF8,
        StandardOutputEncoding = Encoding.UTF8,
        UseShellExecute = false,
        WindowStyle = ProcessWindowStyle.Hidden
    };

    ASF.StartInfo = ASFInfo;
    ASF.OutputDataReceived += OutputHandler;
}

private void OutputHandler(object sender, DataReceivedEventArgs e)
{
    if (e.Data.EndsWith("input:"))
    {
        var result = Interaction.InputBox(e.Data, @"Enter necessary input");
        ASF.StandardInput.WriteLine(result);
        ASF.StandardInput.Flush();
    }

    ...

}

例如:

This line is printed in the richtextbox, because it doesn't require an input.
Enter your input: _ (This is when the prompt must be shown)
This line is never shown because the process is waiting an input.

感谢。

1 个答案:

答案 0 :(得分:0)

你可以更容易地做同样的事情,但在控制台中,正如所说的那样。

不会使文本框在每个输入上触发事件,因为这会在您添加的每个字符上触发事件。

如果您真的想使用文本框,我建议您添加一个"提交"文本框下方的按钮,可用于触发事件。

OR

你可以绑定一个像Enter一样的按钮,当光标在文本框内并按Enter键时抛出一个事件