2009-11-10 2 views
13

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

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

+0

Ваша проблема поднимает мой интерес. Я сделал некоторые причуды для обнаружения модальных циклов в приложениях GUI (см. Мои вопросы), но для консольных приложений до сих пор я не нашел подходящего решения ... – jdehaan

ответ

14

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

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

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

process.StandardInput.Close(); 

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

+0

Это, похоже, работает на моей тестовой установке. Я попробую это по сравнению с реальной программой, вызвавшей проблемы. Для справки: Использование process.StandardInput.Close() моя выполняемая программа не получила исключения, она просто перестала работать тихо. –

+1

Сегодня я обнаружил, что вы хотите проверить, является ли 'WaitReason'' ThreadWaitReason.LpcReply'. –

2

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

+0

Отличный подход. Он не затрагивает мою проблему, но является допустимым подходом к ситуациям, когда вы можете делать ставки на выходе. Еще раз спасибо. –

+0

Хотя это может не всегда работать, так как некоторые консольные программы не очищают пользовательскую подсказку до консоли, пока она не получит ответ. –