2013-10-07 50 views
-2

我见过使用ConsoleRead API函数C#示例,但是当我试着翻译为VBNET我得到了很多的错误,也在其他网站,如PInvoke的独特的例子是C#也一样,我无法找到任何有关ConsoleRead API函数VBNET的良好信息(如果存在无APIS的情况下读取控制台缓冲区的方法,那么我不知道)。如何在VBNET中读取控制台缓冲区?

此外,我已经尝试了VBNET(http://pastebin.com/XYxakDTV)这个控制台缓冲区阅读器类,但它会抛出一个未处理的异常,像这样的消息“控制器无效”。

有人能说明我和所有其他人对于如何从一个GUI应用程序(WindowsForm)启动一个进程,读取控制台输出检索字符/字符串VBNET的例子吗?

UPDATE:

我不知道,但我认为,一个启动的过程(使用System.Process类)不分配控制台应用程序,所以我觉得在这里看到所有的例子在MSDN不由我:http://msdn.microsoft.com/en-us/library/system.console.aspx

+0

如何启动进程?我会一直期待,你可以用流重定向做到这一点,而不需要* * P/Invoke的,毕竟... –

+0

@Rowland肖您好,我启动过程,通常,该工艺具有自己的进度,并同时取得进展这个过程没有满足我无法读整行(CLI进度条行),所以我需要逐字符读取控制台输出来检索进度,我已经解决了这个问题,读取char使用流读者,但我有另一个问题未解决,过程错误输出无法读取(至少我已经尝试了很多东西,但无法读取它),所以我希望如果从控制台缓冲区读取它,我将能够读取任何过程输出(除了输入) – ElektroStudios

回答

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 

它生成一个空格分隔每秒一个数字。 现在的表格应用程序。让我们有一个形式与多TextBox名为txtResultbuttoncmdStart

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魔术,但它的工作原理。

+1

您好,当然与我可以读取输出而不是缓冲液,也“读取”方法是用于读取每一个字符一个一个,它返回其需要是唯一的一个整数值的转换为字符,所以代码使用字符串变量le在另一个答案是完全错误的,因为输出将是很多的数字,而不是字符......反正我知道如何做,但不是我所要求的,如何读取缓冲区(我想所有输出合并在该缓冲区中),但真的非常感谢你。原谅我的英语。 – ElektroStudios

+2

@ElektroHacker你正在写关于读取一个缓冲区,这意味着序列化的数据。从字符串解析数字的必要性是令人讨厌的,但是可以解决而且不太困难。 – IvanH