.NET 控制台标准输出不返回输入"question"



我正在尝试完全拦截控制台应用程序,也就是说,获取它的输出并插入输入。

到目前为止,我几乎可以获取输出,并且输入是完全完美的。但是,在您发送一些输入之前,它不会显示控制台输出的"前缀"/"问题"。

例如,挂接到CMD.exe控制台时。当你经常在Windows中启动它时,你会得到这样的东西:

Microsoft Windows[版本6.1.7600]
版权所有(c)2009 Microsoft Corporation。保留所有权利。

C: \用户\用户名>

但是,输出仅返回:

Microsoft Windows[版本6.1.7600]
版权所有(c)2009 Microsoft Corporation。保留所有权利。

然后,当你插入类似"D:"的东西(转到D:\磁盘)时,你会得到以下内容:

C: \用户\用户名>D:

就是这样。也不会给你"D:\>",重新开始循环。

这是我目前的代码,但是,我百分之九十九确信它没有错。除了这个,它工作得很好。

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。

一如既往,我们非常感谢您的帮助。

-René

C#.Net中的p.S.解决方案/建议也被接受。

您无法获得所需的额外数据,因为这些数据是作为应用程序本身通过"CMD"生成的。我相信您尝试接收的功能甚至没有输出到输出流。

这可能是因为Windows将此额外功能添加到它启动的每个控制台应用程序中,而不是应用程序实际作为输出流发送的内容。

我建议你做的是找出CMD开始的默认路径(看起来相当于):

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

您可以使用它来模拟相同的功能。

如果您想知道CMD在哪里检查应用程序等等,请查看系统上的环境变量,更具体地说是"PATH"环境变量。

最新更新