2017-08-02 57 views
-1

我正在開發一個項目,通過在Mac OS上鍵入命令(如終端)來執行某些特定操作。問題是Console.ReadLineConsole.ReadKey方法不能相互共享線程。在Console.Readline運行時鍵入事件

例如, 我正在創建一個程序,當我在使用Console.ReadLine鍵入字符串時按ESC鍵時終止。

我可以通過以下的方式做到這一點:

ConsoleKeyInfo cki; 
while (true) 
{ 
    cki = Console.ReadKey(true); 
    if (cki.Key == ConsoleKey.Escape) 
     break; 

    Console.Write(cki.KeyChar); 

    // do something 
} 

但與該方法的問題是,按Backspace鍵,你在控制檯上鍵入不會刪除輸入字符串的最後一個字符。

要解決此問題,我可以保存輸入字符串,按Backspace鍵時初始化控制檯屏幕,然後再次輸出保存的字符串。但是,我想保存之前輸入的字符串記錄,我不想初始化。

如果有方法清除已使用Console.Write打印的字符串的一部分,或者在使用Console.ReadLine輸入字符串時按下特定鍵時發生的事件,則上述問題可能是輕鬆解決。

回答

1
string inputString = String.Empty; 
do { 
     keyInfo = Console.ReadKey(true); 
// Handle backspace. 
     if (keyInfo.Key == ConsoleKey.Backspace) { 
      // Are there any characters to erase? 
      if (inputString.Length >= 1) { 
       // Determine where we are in the console buffer. 
       int cursorCol = Console.CursorLeft - 1; 
       int oldLength = inputString.Length; 
       int extraRows = oldLength/80; 

       inputString = inputString.Substring(0, oldLength - 1); 
       Console.CursorLeft = 0; 
       Console.CursorTop = Console.CursorTop - extraRows; 
       Console.Write(inputString + new String(' ', oldLength - inputString.Length)); 
       Console.CursorLeft = cursorCol; 
      } 
      continue; 
     } 
     // Handle Escape key. 
     if (keyInfo.Key == ConsoleKey.Escape) break; 
Console.Write(keyInfo.KeyChar); 
inputString += keyInfo.KeyChar; 
} while (keyInfo.Key != ConsoleKey.Enter); 

取自msdn本身的示例。 https://msdn.microsoft.com/en-us/library/system.consolekeyinfo.keychar(v=vs.110).aspx

+0

哦,謝謝,謝謝 –