2009-11-10 63 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