2011-06-28 4 views
0

コンソールアプリケーションを完全に傍受しようとしています。つまり、出力を取り込み、入力を挿入しようとしています。.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のソリューション/提案も受け付けています。

答えて

1

"CMD"をアプリケーション自体として生成するため、探している余分なデータを取得する方法はありません。私は受信しようとしている機能が出力ストリームに出力されていないと考えています。

これは、Windowsが起動するすべてのコンソールアプリケーションにこの特別な機能を追加し、アプリケーションが実際に出力ストリームとして送信するものではないためです。

System.Environment.GetFolderPath(Environment.SpecialFolder.Personal) 

あなたは同じ機能をシミュレートするためにそれを使用することができます:私はあなたが提案する何

は、CMDは(と同等であるように思われる)にスタートするデフォルトのパスを把握することです。

CMDがアプリケーションなどをチェックする場所を知りたい場合は、システムの環境変数、より具体的には "PATH"環境変数を参照してください。

+0

申し訳ありません、ありがとうございます!私はそれをしなければならないと思う:) –

関連する問題