-2

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

我也试过这个用于 VBNET 的控制台缓冲区读取器类(http://pastebin.com/XYxakDTV),但它会抛出一个未处理的异常,并带有类似“控制器无效”的消息。

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

更新:

我不确定,但我认为启动的进程(使用 System.Process 类)不会将控制台分配给应用程序,所以我认为 MSDN 中看到的所有示例都无法帮助我:http: //msdn.microsoft .com/en-us/library/system.console.aspx

4

1 回答 1

1

利用

StandardOutput.Read

我认为答案与您的其他问题相同运行命令行进程并在该进程仍在运行时获取输出?

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

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 

它每秒生成一个空格分隔的数字。现在表单应用程序。让我们有一个TextBox名为多行txtResult和 a的表单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

它每行将数字写入一个文本框。没有 API 魔法,但它可以工作。

于 2013-10-10T17:04:23.020 回答