如何使用VB.net获取Windows控制台应用程序的文本?

时间:2016-08-04 18:32:27

标签: .net vb.net windows

我正在使用VB 2010自动运行在外部Windows控制台(cmd.exe)上运行的应用程序。请注意,我想继续正常使用外部控制台,但有时,我想从VB应用程序中捕获控制台文本。将文本命令发送到控制台没有问题 从我的VB应用程序上的按钮使用,例如:

...
Dim As IntPtr = FindWindow destination ("ConsoleWindowClass", "consoleapp")
SendMessage (destination, WM_CHAR, VK_RETURN, "")
...

但是,似乎无法获取控制台窗口中显示的文本。我尝试使用标准输出重定向:

...
oStartInfo = New ProcessStartInfo ("consoleapp.exe")
oStartInfo.UseShellExecute = False
oStartInfo.RedirectStandardOutput = True
oProcess.StartInfo = oStartInfo
oProcess.Start ()
...

然后我使用以下方法读取输出流:

....
Dim oStreamReader As System.IO.StreamReader = oProcess.StandardOutput
sOutput = oStreamReader.ReadLine ()
....

这样我可以从VB应用程序中读取标准输出,但我无法使用控制台,因为控制台没有显示任何文本(因为它已被重定向!)。另一方面,一旦启动控制台进程,就无法更改标准输出重定向。

我也尝试使用'GetWindowText',但不适用于属于其他应用程序的Windows。

现在我使用'SendMessage'和'WM_GETTEXT'如下:

...
Dim windowhandle As IntPtr = FindWindow ("ConsoleWindowClass", "consoleapp")
Dim ChildHandle As IntPtr = FindWindowEx (windowhandle, IntPtr.Zero, Nothing, Nothing)
Dim RcvText As String

'Alloc memory for the buffer That recieves the text
Dim mybuffer As IntPtr = Marshal.AllocHGlobal (200)

'The WM_GETTEXT Send Message
SendMessage (ChildHandle, WM_GETTEXT, 200, mybuffer)

'Copy the characters from the unmanaged memory to a managed string
RcvText = Marshal.PtrToStringUni(mybuffer)

'Display the string
Debug.Print (RcvText)
...

但我得到的只是奇怪的文本字符串,但没有控制台的文本内容。

由于控制台窗口没有子窗口,我尝试使用SendMessage(Windowhandle ...)而不是SendMessage(ChildHandle ...), 但结果也是奇怪的字符串...

有没有办法使用VB读取Windows控制台的文本?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:-1)

选项很少,但应该阅读控制台文字

Console.ReadLine()