2011-07-19 39 views
0

我有一個Win32應用程序,我使用下面的代碼啓動控制檯應用程序控制臺應用程序的所有輸出線:閱讀從Win32應用程序工作使用C#

public void ExecuteDecript(int element) 
{ 
    string toquen = TaskList[element].MakeToquen(); 
    string cmdexePath = @"C:\Windows\System32\cmd.exe"; 
    string myApplication = @"d:/SL3-xgold/tools/oclHashcat-lite-0.05/" + toquen; 
    string cmdArguments = String.Format("/K {0}", myApplication); 

    OCLProcess = new Process(); 
    OCLProcess.StartInfo.FileName = cmdexePath; 
    OCLProcess.StartInfo.Arguments = cmdArguments; 
    OCLProcess.StartInfo.UseShellExecute = false; 
    OCLProcess.StartInfo.RedirectStandardOutput = true; 
    OCLProcess.OutputDataReceived += OutputHandler; 

    OCLProcess.Start(); 
    OCLProcess.BeginOutputReadLine();    
} 

private static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine) 
{ 
    if (!String.IsNullOrEmpty(outLine.Data)) 
    { 
     MessageBox.Show(outLine.Data); 
    } 
} 

的問題是,我讀了所有的線的控制檯應用程序,但最後一個僅在關閉控制檯應用程序時才被讀取。任何關於它的理論?

回答

1

上面的代碼應該沒有任何問題地運行。然而,問題必須出現在控制檯應用程序上,也許在最後寫上Console.Write而不是Console.WriteLine,所以它不會被讀取,直到應用程序終止並且如此刷新該流。如果這沒有幫助,請爲您的控制檯應用程序發佈一些代碼以進一步診斷問題。

+0

嗨,謝謝,但這是問題,cosole appilication.I'm不是爲了控制cosole應用程序(oclhashcat-lite-32),並且此應用程序的代碼是未知的我的.... – Tony

+0

@Tony:在這種情況下,不要使用process.BeginOutputReadLine(),而是使用process.StandardInput流,並通過standardInput.Read讀取緩衝區並從緩衝區中以您想要的方式構建字符串... –

+0

謝謝,我實現了你的建議,它的作品。現在我有一個新問題。我想編寫任何命令(例如,終止底層進程的「q」),但似乎我的代碼並未寫入應用程序的輸入。這裏是代碼: StreamWriter processStreamWriter = OCLProcess.StandardInput; processStreamWriter.Write(「q」); processStreamWriter.Close(); 我也嘗試使用processStreamWriter.WriteLine(「q」) 而不是processStreamWriter.Write(「q」),但它沒有奏效。任何建議? – Tony