2009-11-10 31 views
13

我正在使用Process类来运行exe。我的程序是否在等待输入?

的EXE是一个第三方控制台应用程序,我无法控制。

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

如果这有什么区别,我想杀死应用它应该是等待输入。

有用于当有从程序等待读输出合适的事件,但我看不到时,过程耐心等待输入类似的事情。

  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(); 

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

+0

你的问题引起了我的兴趣。我做了一些怪异的检测GUI应用程序中的模态循环(请参阅我的问题),但对于控制台应用程序,到目前为止我还没有找到一个好的解决方案... – jdehaan 2009-11-10 00:08:21

回答

14

根据什么第三方程序做正是你可以尝试轮询的线程的状态:

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

做不到这一点......你可以尝试

process.StandardInput.Close(); 

调用开始后( ),我猜想如果它试图从标准输入中读取,子进程中将会引发异常。

+0

这似乎在我的测试装置中工作。我会尝试它与实际的程序,然后导致我的问题。 对于信息:使用process.StandardInput.Close()我的程序正在运行没有收到异常,它只是静静地停止运行。 – 2009-11-10 15:40:50

+1

今天我发现你想检查'WaitReason'是否是'ThreadWaitReason.LpcReply'。 – 2013-10-08 00:58:45

2

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

+0

伟大的方法。它不能解决我的问题,但对于可以在输出中存储的情况,这是一种有效的方法。再次感谢。 – 2009-11-10 15:41:54

+0

尽管这可能并不总是有效,因为某些控制台程序在获得响应之前不会将用户提示刷新到控制台。 – 2014-12-26 09:17:06