【问题标题】:Is my process waiting for input?我的进程是否在等待输入?
【发布时间】:2009-11-10 00:03:24
【问题描述】:

我正在使用 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();

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

【问题讨论】:

  • 你的问题引起了我的兴趣。我做了一些怪癖来检测 GUI 应用程序中的模态循环(请参阅我的问题),但对于控制台应用程序,到目前为止我还没有找到一个好的解决方案......

标签: c# .net system.diagnostics


【解决方案1】:

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

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

失败了……你可以试试

process.StandardInput.Close();

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

【讨论】:

  • 这似乎在我的测试台上工作。我将尝试它与实际程序接下来会导致我的问题。有关信息:使用 process.StandardInput.Close() 我正在运行的程序没有收到异常,它只是安静地停止运行。
  • 我今天发现你要检查WaitReason是不是ThreadWaitReason.LpcReply
【解决方案2】:

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

【讨论】:

  • 很棒的方法。它没有解决我的问题,但对于可以依靠输出的情况来说是一种有效的方法。再次感谢。
  • 虽然这可能并不总是有效,因为某些控制台程序在得到响应之前不会将用户提示刷新到控制台。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多