2011-07-30 73 views
3

我有2個應用程序時,允許C#應用程序的StandardInput的重定向,A & B.做 「Console.ReadKey」

  • 一流程內呼叫B。
  • b執行一些東西像Console.WriteLine和到Console.ReadLine
  • 由於這個MSDN Article,我莫名其妙地管理重定向B的輸出,並養活它的輸入,以及。

  • 我不設法做,是擁有B中工作Console.ReadKey功能。我做了一個try catch塊角落找尋這個功能,我得到這個錯誤信息:

無法讀取密鑰時,無論是應用程序沒有控制檯時,或控制檯輸入已經從一個文件重定向。嘗試Console.Read

事實是,我必須使用Console.ReadKey,所以我需要找到一種方法,使其工作...任何想法?

下面是甲


代碼在主功能的有用的部分:

Process P2 = new Process(); 
P2.StartInfo.FileName = Environment.CurrentDirectory + "\\Main2.exe"; 
P2.StartInfo.UseShellExecute = false; 
P2.StartInfo.RedirectStandardOutput = true; 
P2.OutputDataReceived += new DataReceivedEventHandler(WriteOutput); 
P2.StartInfo.RedirectStandardInput = true; 
P2.Start(); 
StreamWriter ExeInput = P2.StandardInput; 
P2.BeginOutputReadLine(); 
ConsoleKeyInfo KeyPressed; 
do 
{ 
    KeyPressed = Console.ReadKey(); 
    if(KeyPressed.Key == ConsoleKey.Enter) 
    { 
     Console.WriteLine(); 
     ExeInput.Write("\n"); 
    } 
    else 
     ExeInput.Write(KeyPressed.KeyChar); 
} while (!P2.HasExited); 

的處理程序outputdatareceived:

private static void WriteOutput(object sendingProcess, DataReceivedEventArgs outLine) 
{ 
    if (!String.IsNullOrEmpty(outLine.Data)) 

    { 
     Console.WriteLine(outLine.Data); 
    } 
} 
+0

試着看看這篇文章對你有用:http://www.codeproject.com/KB/dialog/less_command.aspx。實際上,它不使用'Process'類,但是在做這種事情時顯示了一種調用Console.ReadKey()的方法。 –

+4

你的問題似乎要求一個解決方案,違反了dcoumented約束。您不能使用ReadKey。文件說明如此。繼續前進一個可行的解決方案。 –

回答

5

I」米不知道有任何方式可以使用ReadKey()重定向控制檯程序的StdIn/StdOut時。此外,爲了讀取和寫入子進程,您需要確保使用Console.Out.Write()/Console.In.Read()來防止從子進程拋出異常,因爲它缺少控制檯窗口。

您可以使用Convert.ToChar(ExeOutput.Read())將輸入轉換爲有效的KeyChar,mimicing的ReadKey()行爲記同步也請VS異步讀/寫。如果您使用BeginOutputReadLine()和異步讀取流,P2.HasExited你的病情,同時可以使用ExeOutput.Read()

 ..... 
     P2.Start(); 
     StreamWriter ExeInput = P2.StandardInput; 
     StreamReader ExeOutput = P2.StandardOutput; 
     do 
     { 
      var k = P2.StandardOutput.Read(); 
      var key = Convert.ToChar(k); 
      if (key == Convert.ToChar(ConsoleKey.Enter)) 
      { 
       Console.WriteLine(); 
       ExeInput.Write("\n"); 
      } 
      else 
       ExeInput.Write(key); 
     } while (!P2.HasExited); 
     .... 

當幸運的你閱讀之前成爲真正的所有輸入鍵,數據流將被緩衝,如果進程已退出在閱讀每一行之前,如果這符合你想要完成的任務,那麼你可以考慮將條件改爲while(!P2.HasExited && !P2.StandardOutput.EndOfStream)

+0

我假設你想說var k = Console.In.Read();好吧,它用Console.In更好一點。確實感謝,謝謝。但我仍然沒有得到B的Console.ReadKey工作... – GianT971

+1

您不能在B中使用Console.ReadKey。您必須使用Console.In.Read()並執行與上面相同的代碼。 –

+0

'Console.In.Read'不會返回,直到用戶輸入完整行,而'Console.ReadKey'只要用戶輸入任何鍵就立即返回。任何安全的讀取重定向輸入流的方法,只要鍵入它們就能夠讀取單個按鍵? –

相關問題