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

Posted

技术标签:

【中文标题】如何使用 VB.net 获取 Windows 控制台应用程序的文本?【英文标题】:How do I get the text of a Windows console application using VB.net? 【发布时间】:2016-08-04 18:32:26 【问题描述】:

我正在使用 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”,但不适用于属于其他应用程序的窗口。

现在我使用 '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 控制台的文本?

非常感谢您的帮助。

【问题讨论】:

Capturing console output from a .NET application (C#)的可能重复 @KenWhite 这不是重复的,因为 OP 希望捕获输出,同时仍将其保留给原始控制台以显示在其窗口中。 您能否更改控制台应用程序的代码,将输出写入 txt 文件,然后从您的应用程序中读取。 @BanForFun,不是真的。我尝试这样做,但是在控制台进程启动后您无法重定向标准输出。然后您将无法使用控制台,因为控制台不显示任何文本(因为它已被重定向到 txt 文件)。我还尝试了powershell的'tee'功能,但不幸的是控制台应用程序不能与'tee'一起正常工作。 :( .................... 【参考方案1】:

选项很少,但这应该读取控制台文本

Console.ReadLine()

【讨论】:

要像这样读取控制台文本,您需要将其分配给变量。 Dim input as string input = console.readline() 方法console.readline()从标准输入流中读取下一行字符,但是我想读取控制台输出流。

以上是关于如何使用 VB.net 获取 Windows 控制台应用程序的文本?的主要内容,如果未能解决你的问题,请参考以下文章

请问VB.NET 怎么获取当前所有已登录到windows系统的用户名?

如何使用 vb.net 从 maxmind GeoIP ISP.data 获取 ISP

如何使用 C# 或 VB.NET 获取当前的本地主机名? [复制]

如何让我的 VB.net 程序在 Windows XP 上运行?

vb.net 获取键盘布局

如何从 VB.NET 中的 USB 端口获取数据