Мой процесс ожидает ввода? - PullRequest
18 голосов
/ 10 ноября 2009

Я использую класс 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();

Как определить, что мой процесс ожидает ввода?

Ответы [ 2 ]

17 голосов
/ 10 ноября 2009

В зависимости от того, что делает сторонний процесс, вы можете попробовать опрашивать состояния его потоков:

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

Если это не так ... вы можете попробовать

process.StandardInput.Close();

после вызова Start () я предполагаю, что в дочернем процессе возникнет исключение, если он попытается прочитать из стандартного ввода.

2 голосов
/ 10 ноября 2009

Если консольное приложение имеет какое-то приглашение, ожидающее ввода, вы можете периодически анализировать текст вывода консоли, используя свойство Process.StandardOutput процесса, и ждать указанного приглашения. Как только правильная строка обнаружена, вы знаете, что она ожидает ввода. Смотри http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx.

...