Мой процесс ждет ввода?
Я использую класс 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"); для отправки ввода в консоль в С#