19

我正在使用 Process 类来运行一个 exe。

该 exe 是我无法控制的第 3 方控制台应用程序。

我想知道该进程是否正在等待命令行上的输入。

如果它有任何区别,我打算在它等待输入时终止应用程序。

当程序有输出等待读取时有合适的事件,但是当进程耐心等待输入时,我看不到任何类似的事件。

            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = "myapp.exe";
            info.CreateNoWindow = true;
            info.UseShellExecute = false;
            info.RedirectStandardError = true;
            info.RedirectStandardInput = true;
            info.RedirectStandardOutput = true;
            process.StartInfo = info;

            process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
            process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived);

            process.Start();

            process.BeginOutputReadLine();
            process.BeginErrorReadLine();


            process.WaitForExit();

如何检测我的进程正在等待输入?

4

3 回答 3

20

根据 3rd 方进程正在做什么,您可以尝试轮询其线程的状态:

foreach(ProcessThread thread in process.Threads)
    if (thread.ThreadState == ThreadState.Wait
        && thread.WaitReason == ThreadWaitReason.UserRequest)
            process.Kill();

失败了......你可以尝试

process.StandardInput.Close();

在调用 Start() 之后,我猜想如果子进程试图从标准输入中读取,则会在子进程中引发异常。

于 2009-11-10T03:28:05.333 回答
2

如果控制台应用程序有某种提示等待输入,您可以使用进程的 Process.StandardOutput 属性定期解析控制台输出文本并等待所述提示。一旦检测到正确的字符串,您就知道它正在等待输入。请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx

于 2009-11-10T03:40:10.943 回答
-1

使用 process.StandardInput.writrLine("input"); 用于在 c# 中将输入发送到 consol

于 2019-07-16T13:18:43.393 回答