我正在使用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控制台的文本?
非常感谢你的帮助。
答案 0 :(得分:-1)
选项很少,但应该阅读控制台文字
Console.ReadLine()