2016-08-04 8 views
0

私は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コンソールのテキストを読む方法がありますか?

ありがとうございました。

+0

[.NETアプリケーション(C#の)からのコンソール出力をキャプチャ]の可能複製(http://stackoverflow.com/questions/186822/をお読みくださいopen-a-net-application-c-output-a-net-application-c) –

+0

@KenWhite OPはオリジナルのコンソールをウィンドウに表示したまま出力をキャプチャしたいので、重複しません。 – GSerg

+0

コンソールアプリケーションのコードを変更して、出力をtxtファイルに書き込んだ後、アプリケーションから読み取ることができます。 – BanForFun

答えて

-1

あり、いくつかのオプションがあるが、これは、コンソールのテキスト

Console.ReadLine() 
+0

)コンソールテキストを読み込み、変数に割り当てる必要があります。Dim input as string input = console.readline() ' –

+0

メソッドconsole.readline()は、次の行の文字を標準入力ストリームから読み込みますが、コンソール出力ストリームを読みたいと思います。 – JoeMac

関連する問題