2012-07-12 116 views
1

首先,Console.ReadKey()不是答案。如何獲得第一個字符

我需要能夠擦除我寫的第一個字符。

基本上,我試圖做的是一個應用程序,可以測量您的打字速度。 它完美的作品,但我試圖找出美學。

我剛開始做的事情是打電話給Console.ReadKey(),然後調用這個函數啓動一個Timer(當然,在我寫了一個應用程序之後,我發現它恰好是一個Stopwatch類._。),我會將用戶輸入的字符串存儲爲Console.ReadLine(),然後停止該定時器。

static Word[] getWords() 
{ 
    Word[] words; 
    int c = Console.ReadKey().KeyChar; 
    Timing.start(); 
    string str = (c.ToString() + Console.ReadLine()).ToLower(); 
    charCount = str.Length; 
    words = Word.process(str); 
    Timing.stop(); 
    return words; 
} 

charCount是一個靜態int和Word僅僅是包裝一個字符串的類。 Word.process是一個函數,它接受一個字符串,省略所有符號並返回用戶輸入的單詞數組。 Timing只是一個包裝Timer類的類。 我認爲這就是所有需要解釋的代碼。

我需要做的就是撥打Timing.start()當用戶鍵入一個字符,他必須能夠擦除它。

+2

是否必須是一個控制檯應用程序?因爲如果你被允許使用Windows窗體,那真的不是正確的工具... – Ryan 2012-07-12 14:22:52

+0

谷歌「基於事件的鍵盤輸入」 – 2012-07-12 14:23:32

+1

爲什麼'Console.ReadKey()'不是答案?因爲你需要能夠使用退格鍵?是否有任何理由不能使用'Console.ReadKey()'並自己處理退格功能? – 2012-07-12 14:25:13

回答

3

需要一點調整,但這樣的事情呢?

更新 - 現在一個(1)退格工作,但多個不會。哎呀!希望這會讓你指向正確的方向。

更新#2 - 使用StringBuilder的....退格現在的工作:)

namespace ConsoleApplication4 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      StringBuilder sb = new StringBuilder(); 
      // you have alot of control on cursor position using 
      // Console.SetCursorPosition(0, Console.CursorTop -1); 
      List<DateTime> inputs = new List<DateTime>(); 
      ConsoleKeyInfo cki; 

      Console.WriteLine("Start Typing..."); 
      Console.WriteLine("Press the Escape (Esc) key to quit: \n"); 
      do 
      { 
       cki = Console.ReadKey(); 
       if (cki.Key == ConsoleKey.Spacebar) 
       { 
        sb.Append(cki.KeyChar); 
       } 

       else if (cki.Key == ConsoleKey.Backspace) 
       { 
        Console.Write(" "); 
        Console.Write("\b"); 
        sb.Remove(sb.Length - 1, 1); 
       } 

       else if (cki.Key == ConsoleKey.Enter) 
       { 
        sb.Append(cki.KeyChar + " "); 
        Console.WriteLine(""); 
       } 

       else 
       { 
        sb.Append(cki.KeyChar); 
       } 

       inputs.Add(DateTime.Now); 
      } while (cki.Key != ConsoleKey.Escape); 

      Console.WriteLine(""); 
      Console.WriteLine("====================="); 
      Console.WriteLine("Word count: " + Regex.Matches(sb.ToString(), @"[A-Za-z0-9]+").Count); 

      TimeSpan duration = inputs[inputs.Count - 1] - inputs[0]; 

      Console.WriteLine("Duration (secs): " + duration.Seconds); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

我真的很感謝這樣的努力,它似乎能正常工作,但是當我試圖擦除字符時,控制檯只會改變我輸入的位置而不實際刪除文本。 edit:然後,我可能會檢查退格按鈕是否被點擊,清除屏幕並重新顯示角色,但我覺得這是一件可怕的事情,尤其是當控制檯中有很多文字時。 – 2012-07-12 14:44:56

+0

哦,你更新了它。我想回答我自己的問題,但似乎我的信譽不足。 我有解決方案。我需要使用Console.KeyAvailable檢查輸入流中是否有任何字符。 – 2012-07-12 14:54:24

+0

我已經更新它使用StringBuilder記錄輸入,然後在最後使用正則表達式計算單詞。希望這可以幫助 :) – Phil 2012-07-12 15:05:20

相關問題