コンソールアプリケーションを完全に傍受しようとしています。つまり、出力を取り込み、入力を挿入しようとしています。.NET Console StandardOutputは入力 "question"を返しません
これまでのところ、私はかなり多くの出力を取り込むことができ、入力は完全に完璧です。 しかし、入力を送信するまで、コンソールの出力の "接頭辞"/"質問"は表示されません。
例として、CMD.exeコンソールにフックする場合。
Microsoft Windowsの[バージョン6.1.7600]
著作権(C)2009 Microsoft Corporationの:あなたが定期的にWindowsでそれを起動すると、あなたはこのような何かを得ます。全著作権所有。C:\ユーザー\ユーザー名>
はしかし、出力のみを返します。
Microsoft Windowsの[バージョン6.1.7600]
著作権(C)2009 Microsoft Corporationの。全著作権所有。
そして、あなたは "D:" のようなものを挿入すると、その後(Dに行く:\ディスク):
C:\ユーザー\ユーザー名> 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」について知っていますCPU消費。
いつものように、どんな助けでも大変感謝しています。
-reen
P.S. C#.Netのソリューション/提案も受け付けています。
申し訳ありません、ありがとうございます!私はそれをしなければならないと思う:) –