2015-05-27 60 views
1

我正在使用該調用創建一個進程:c#如何將stdout重定向到新的進程窗口?

Process.Start(startInfo);

startInfo.WindowStyle = ProcessWindowStyle.Normal; 
startInfo.FileName = "cmd.exe"; 
startInfo.UseShellExecute = true; 
startInfo.RedirectStandardInput = false; 
startInfo.RedirectStandardOutput = false; 

時的過程與這些參數運行時,它輸出到新進程的窗口罰款。

但是,當我使UseShellExecute爲false而不重定向標準輸出時,該進程不再打印到屏幕上。這是預期的行爲?

如果是這樣,我怎麼能寫入新窗口,該過程開始?

我可以使用StandardOutput.Read()手動獲取數據,但我不知道如何將它寫入新窗口。當我創建該窗口時,它默認情況下似乎有一個控制檯。

我可以使用的PInvoke來調用新工藝C++函數:

[DllImport("kernel32", SetLastError = true)] 
     private static extern bool AttachConsole(int dwProcessId); 

我想我或許可以使用功能只寫到新窗口的控制檯「writeconsole」 https://msdn.microsoft.com/en-us/library/windows/desktop/ms687401%28v=vs.85%29.aspx

但是,我想知道是否有可能這樣做只是使用.net庫。我覺得我想要的不是那麼複雜,以至於這應該是必要的。

我想要的是能夠啓動一個新進程並將該進程的stdout重定向到在該進程中創建的新窗口,同時保留寫入stdin的能力。

編輯: 使用console.writeline寫入只會寫入程序的主控制檯。我的應用程序是一個GUI應用程序,所以說實話,我不知道它在哪裏寫入,但我知道你可以在visual studio中的「輸出」標籤下看到這個輸出,但不能在程序的窗口中看到本身。我認爲控制檯有一個由.net分配的獨立緩衝區。

+0

所以,你有GUI應用程序啓動控制檯之一。您已經成功地閱讀了輸出結果,並且不知道如何在窗口中顯示它,對嗎?您是否嘗試在窗口中添加文本框並在文本中添加文本? – n0rd

+0

這聽起來像是可能的,儘管我用了不同的方法 –

+0

不同的方式如何?在一個GUI應用程序中,你必須有一個控制你想要放置文本的位置。 'TextBox'在這裏是一個明顯的選擇。你用什麼? – n0rd

回答

1

您可以將stdoutstdinfreopen重定向。

例子:

freopen ("file.txt","w", stdout); //or stdin 

編輯: 您還可以使用createpipe()和管道的讀取結束。然後,您可以告訴管道,您希望在哪裏讀取或存儲/顯示數據。如果這不是你正在尋找的東西,請詳細說明一下評論。

+0

嗯,我真的不想寫入file.txt。我想寫入一個創建的窗口來託管新進程。我使用https://msdn.microsoft.com/en-us/library/0w4h05yb%28v=vs.110%29.aspx 創建了此過程,結果在屏幕上顯示一個新窗口,我希望重定向輸出的新過程。 –

+0

如果你加入下列:'process.StartInfo.RedirectStandardOutput = TRUE;' 'process.OutputDataReceived + =(發件人,參數)=> Console.WriteLine(args.Data);' 'process.BeginOutputReadLine( );' – Adam

相關問題