2012-09-11 103 views
4

我正在C#中構建自定義控制檯界面(Windows)。它只是將控制檯的標準輸入,輸出和錯誤重定向到WPF應用程序中的文本框。在後臺工作器中,「cmd.exe」正在運行,並且只要輸出任何內容,該輸出就會轉到文本框。當您在Windows中運行git push命令時,控制檯的標準輸出重定向會發生什麼

代碼的一部分是本

private void SetBackgroundWorker() 
{ 
    _worker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; 
    _worker.DoWork += (sender, args) => ReadOutput(_worker); 
    _worker.ProgressChanged += (sender, args) => _window.UpdateConsole(args); 
} 

private void ReadOutput(BackgroundWorker worker) 
{ 
    int count; 
    var buffer = new char[1024]; 
    do 
    { 
     var builder = new StringBuilder(); 
     count = _process.Read(buffer, 0, 1024); 
     builder.Append(buffer, 0, count); 
     worker.ReportProgress(0, builder.ToString()); 

    } while (count > 0); 
} 

然後,我可以做「GIT中添加」,「git的狀態」,或「git的承諾」這個界面內的命令(I加入與git bin中的路徑PATH中的目錄),但是當我嘗試「git push origin master」時,文本框不會更新。我期望「用戶名爲'...'」和「密碼爲'...'」,但它永遠不會發生。

當我在命令提示符下執行「混帳推......」,這顯示他們,但在我的WPF界面,「cmd.exe的」似乎沒有輸出在所有重定向,以及我在這裏失去了

我想我可以嘗試的一件事是放棄重定向,並使用Windows API來掛接cmd.exe,但它會變得更加複雜。

如果你能告訴我,我會非常感激。

如果您想查看完整的代碼並進行測試,代碼爲https://github.com/andrewchaa/ConsolePlus。它處於一個非常原始的階段。

回答

3

我想象的是應用程序正在使用類似於WriteConsole的東西,它直接寫入屏幕緩衝區,所以沒有辦法攔截 - 尤其是標準輸出/標準錯誤重定向。我現在不具體說明git應用程序在做什麼;但它確實經常使用顏色,這似乎需要使用像SetConsoleTextAttribute這樣的功能,它也直接處理屏幕內存。

+0

嗯,聽起來我應該通過win api訪問Screen Buffer。謝謝,彼得。 – Andy

0

看來,git.exe將其輸出寫入stdErr。

相關問題