2009-11-10 16 views
13

私はexeを実行するためにProcessクラスを使用しています。私のプロセスは入力を待っていますか?

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

答えて

14

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

...あなたがスタートを呼び出した後

process.StandardInput.Close(); 

に試すことができることを失敗( )、標準入力からの読み込みを試みる場合、子プロセスで例外が発生すると推測します。

+0

これは私のテストリグで動作するようです。実際のプログラムと比較して試してみると、次に問題が発生します。 info:Process.StandardInput.Close()を使用して、実行中のプログラムが例外を受け取っておらず、静かに実行を停止しました。 –

+1

私は今日、あなたが 'WaitReason'が' ThreadWaitReason.LpcReply'かどうかチェックしたいと思ったことを発見しました。 –

2

コンソールアプリケーションに入力待ちのプロンプトがある場合は、プロセスのProcess.StandardOutputプロパティを使用してコンソール出力テキストを定期的に解析し、プロンプトを待つことができます。適切な文字列が検出されると、入力を待っていることがわかります。 http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspxを参照してください。

+0

すばらしいアプローチ。それは私の問題には対処しませんが、あなたがアウトプットを賭けることができる状況のための有効なアプローチです。再度、感謝します。 –

+0

これは、コンソールプログラムが応答を受け取るまで、コンソールにユーザープロンプトをフラッシュしないので、これは常に機能しないかもしれませんが。 –

関連する問題