2014-02-20 68 views

回答

1

是的,它有可能,你可以在CursorPosition設置爲在屏幕任意位置,然後將其設置回底部輸入

Console.SetCursorPosition(Console.WindowLeft, Console.WindowBottom); 

可能-1底部

您可能還需要看看https://github.com/AnthonyMastrean/ConsoleEx

+0

嗯謝謝你,我會在一會兒嘗試一下,有一件事我忘記提到了,我該如何去清理那個區域? – Brodie

+0

如果你可以把光標放在任何地方,並在任何地方寫任何東西,我相信你可以弄清楚如何清除東西:) –

+0

我會給它一個鏡頭,謝謝 – Brodie

0

你的方法有些不正確。您在操作舊版DOS控制檯方面缺乏經驗,並且注意使用內置函數,忘記了Console是基於流的,並且可以手動操作。

當您需要實現自己的文本輸入佈局時,您需要關掉內置的行讀取方法並切換到手動流操作。值得慶幸的是,.NET讓事情變得比在老式的COM中更容易。

例如,您可以從以下代碼開始,將代碼移動到文本輸入並將輸出管理爲五行。當然,它遠非完美(無限循環...靜態變量......呃,對我很恥辱),但我會以原始形式讓它變得更簡單。

爲了將它變成多線程應用程序,您需要使「輸出」線程安全(有很多方法可以實現)並更改Foo()的內容(目前它只是回聲)。

class Program 
{ 
    static List<string> output = new List<string>(); 
    static int maxlines = 5; 
    static void Foo(string s) 
    { 
     // echo 
     output.Add(s); 
     while (output.Count>maxlines) 
     { 
      output.RemoveAt(0); 
     } 
    } 
    static void Main(string[] args) 
    { 
     string s = ""; 
     while (true) 
     { 
      if (Console.KeyAvailable) 
      { 
       char c = Console.ReadKey(true).KeyChar; 
       switch (c) 
       { 
        case '\r': Foo(s); s = ""; break; 
        case '\b': if (s.Length > 0) { s = s.Remove(s.Length - 1); } break; 
        default: s += c; break; 
       } 
       // some clearing 
       Console.SetCursorPosition(Console.WindowLeft, 6); 
       Console.Write("                 "); 
       // and write current "buffer" 
       Console.SetCursorPosition(Console.WindowLeft, 6); 
       Console.Write(s); 
      } 
      // now lets handle our "output stream" 
      for (int i = 0; i < Math.Min(maxlines, output.Count); i++) 
      { 
       Console.SetCursorPosition(Console.WindowLeft, i); 
       Console.Write(output[i].PadRight(32)); 
      } 
     } 
    } 
} 
+0

我不確定這只是我是一個白癡還是什麼,但是我怎樣才能實現ReadLine,因爲這似乎只關注輸出,我可以用提供的標準方法輕鬆完成。 – Brodie

+0

Foo()方法可以認爲是ReadLine,它是在按下Enter之後調用的,它的參數是從用戶輸入的。要使用這個例子,你需要把它輸入到處理塊。總之,它是基於事件的輸入系統。 – PTwr