如何在VBNET中读取控制台缓冲区?

时间:2013-10-07 15:45:22

标签: .net vb.net process buffer interprocess

我看过一个使用ConsoleRead API函数的C#示例,但是当我尝试将其转换为VBNET时,我得到了很多错误,也在pinvoke等其他网站中,这个唯一的例子也适用于C#,我不能找到VBNET的ConsoleRead API函数的任何好信息(如果有一种方法来读取没有APIS的控制台缓冲区,那么我不知道)。

此外,我已经尝试过这个用于VBNET的控制台缓冲读取器类(http://pastebin.com/XYxakDTV),但它会抛出一个未处理的异常,并显示“Controller not valid”这样的消息。

有人可以向我和其他所有人举例说明VBNET如何从GUI应用程序(WindowsForm)启动进程以读取控制台输出以检索字符/字符串吗?

  

更新:

我不确定,但我认为启动的进程(使用System.Process类)不会将控制台分配给应用程序,因此我认为MSDN中的所有示例都无法帮助我:{{3} }

1 个答案:

答案 0 :(得分:2)

使用

StandardOutput.Read

我认为答案与您的其他问题Run a commandline process and get the output while that process still running?

相同

编辑您要求表单应用程序读取控制台输出。所以让我们有一个控制台应用程序():

Module Module1

    Sub Main()
        While True
            ' data = Console.ReadKey.KeyChar
            Dim Generator As System.Random = New System.Random()
            Console.Write(Generator.Next(0, 100) & " ")
            Threading.Thread.Sleep(1000)
        End While
    End Sub

End Module 

它每秒生成一个空格分隔数字。 现在表单应用程序。我们的表单中包含一条名为TextBoxtxtResult button的多行cmdStart

Private Sub cmdStart_Click(sender As Object, e As EventArgs) Handles cmdStart.Click
        Dim ProcInfo As New ProcessStartInfo With
            {.FileName = "DataApp.exe", .RedirectStandardOutput = True, .UseShellExecute = False}
        Dim proc As Process = Process.Start(ProcInfo)

        While Not proc.HasExited
            Dim a As String = ChrW(proc.StandardOutput.Read)
            If a = " " Then
                txtResult.Text &= vbCrLf
            Else
                txtResult.Text &= a
            End If
            Threading.Thread.Sleep(100)
            Application.DoEvents()
        End While

    End Sub

每行将数字写入TextBox一个。没有API魔法,但它有效。