Я пытаюсь полностью перехватить консольное приложение, то есть захватить его вывод и вставить ввод.
Пока что я могу в значительной степени захватить вывод, и ввод совершенно идеален.
Тем не менее, он не будет отображать «префикс» / «вопрос» вывода консоли, пока вы не отправите какой-либо ввод.
Например, при подключении к консоли CMD.exe. Когда вы регулярно запускаете его в Windows, вы получаете что-то вроде этого:
Microsoft Windows [Версия 6.1.7600]
Авторские права (c) 2009 Корпорация Microsoft. Все права защищены.
C: \ Users \ Имя пользователя>
Однако вывод только возвращает:
Microsoft Windows [Версия 6.1.7600]
Авторские права (c) 2009 Корпорация Microsoft. Все права защищены.
И затем, когда вы вставляете что-то вроде «D:» (чтобы перейти на диск D: \), вы получаете следующее:
C: \ Users \ Имя пользователя> D:
И это все. Также не выдает "D: \>", начиная цикл заново.
Это мой текущий код, однако я на 99% уверен, что в этом нет ничего плохого. Он отлично работает за исключением этого.
Class MainWindow
Private MainDispatcher As System.Windows.Threading.Dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher
Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
StartProcess("cmd.exe")
End Sub
Private Sub InputTB_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles InputTB.KeyUp
If e.Key = System.Windows.Input.Key.Enter Then
InputStream.WriteLine(InputTB.Text)
InputTB.Text = ""
End If
End Sub
Private InputStream As IO.StreamWriter
Private OutputStream As IO.StreamReader
Public ProcessToMonitor As New Process
Private Sub StartProcess(ByVal FileName As String)
ProcessToMonitor = New Process
ProcessToMonitor.StartInfo.FileName = FileName
ProcessToMonitor.StartInfo.UseShellExecute = False
ProcessToMonitor.StartInfo.RedirectStandardError = True
ProcessToMonitor.StartInfo.RedirectStandardOutput = True
ProcessToMonitor.StartInfo.RedirectStandardInput = True
ProcessToMonitor.StartInfo.ErrorDialog = False
ProcessToMonitor.StartInfo.CreateNoWindow = True
ProcessToMonitor.Start()
InputStream = ProcessToMonitor.StandardInput
OutputStream = ProcessToMonitor.StandardOutput
ConstantReadThread.Priority = System.Threading.ThreadPriority.Lowest
ConstantReadThread.Start()
End Sub
Private Sub OutputReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs)
MainDispatcher.Invoke(New WriteOutputDelegate(AddressOf WriteOutput), e.Data)
End Sub
Private ConstantReadThread As New System.Threading.Thread(AddressOf ConstantRead)
Private Sub ConstantRead()
Do
MainDispatcher.Invoke(New WriteOutputDelegate(AddressOf WriteOutput), OutputStream.ReadLine())
Loop
End Sub
Private Delegate Sub WriteOutputDelegate(ByVal Text As String)
Private Sub WriteOutput(ByVal Text As String)
OutputTB.Text &= Text & vbNewLine
OutputTB.ScrollToEnd()
End Sub
Конечный класс
Я также знаю о «OutputDataReceived», который я использовал сначала, у которого были те же проблемы, поэтому я перешел к циклу чтения, я знаю, что он потребляет больше ресурсов процессора.
И, как всегда, любая помощь очень ценится.
-René
P.S. Решения / предложения в C # .Net также принимаются.