Мой процесс ждет ввода?

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

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

Ответы

Ответ 1

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

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

В противном случае... вы можете попробовать

process.StandardInput.Close();

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

Ответ 2

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

Ответ 3

Используйте process.StandardInput.writrLine("input"); для отправки ввода в консоль в С#