19

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

プロセスが入力を待っていることを検出するにはどうすればよいですか?

4

3 に答える 3

20

サードパーティのプロセスが正確に何をしているかに応じて、そのスレッドの状態をポーリングしてみることができます:

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 に答える