私はVB 2010を使用して、外部Windowsコンソール(cmd.exe)上で実行されているアプリケーションを自動化しています。私は外部コンソールを通常どおり使用したいと考えていますが、時々、VBアプリケーションからコンソールテキストを取得したいと思います。VB.netを使用してWindowsコンソールアプリケーションのテキストを取得するにはどうすればよいですか?
...
Dim As IntPtr = FindWindow destination ("ConsoleWindowClass", "consoleapp")
SendMessage (destination, WM_CHAR, VK_RETURN, "")
...
しかし、コンソールウィンドウに表示されるテキストを取得することは不可能と思われる:私は、例えば、使用して私のVBアプリケーション上のボタンからコンソール にテキストコマンドを送信するために何の問題もありません。私は、標準出力のリダイレクト使用してみました:
...
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コンソールのテキストを読む方法がありますか?
ありがとうございました。
[.NETアプリケーション(C#の)からのコンソール出力をキャプチャ]の可能複製(http://stackoverflow.com/questions/186822/をお読みくださいopen-a-net-application-c-output-a-net-application-c) –
@KenWhite OPはオリジナルのコンソールをウィンドウに表示したまま出力をキャプチャしたいので、重複しません。 – GSerg
コンソールアプリケーションのコードを変更して、出力をtxtファイルに書き込んだ後、アプリケーションから読み取ることができます。 – BanForFun