Do sprawdzenia, czy znak został naciśnięty, użyj Console.KeyAvailable
, a do pobrania znaku Console.ReadKey(true)
. Wynikiem tej drugiej funkcji jest obiekt, który we właściwości Key
przechowuje wartość typu wyliczeniowego, a w KeyChar
wartość typu char
. Do ustawienia pozycji kursora użyj Console.SetCursorPosition
. Jeżeli chcesz kontrolować pozycję kursora, to używaj Console.Write
zamiast Console.WriteLine
. Przejrzyj listę metod z klasy Console
i zastanów się, do czego mogą Ci się przydać. Po opisie rozpoznasz, czy są dla Ciebie przydatne. Możesz pominąć te, których działania nie rozumiesz, bo pewnie nie będziesz ich potrzebował.
Napisałem przykładowy bardzo prymitywny kod pokazujący jak użyć tych funkcji. Nie użyłem Twojej obsługi przychodzących wiadomości i wielowątkowości, ale pokazałem tylko, jak można skorzystać z tego, co opisałem wyżej. Możesz rozwinąć swój program o obsługę pozostałych znaków sterujących, takich jak enter, delete, strzałki. Przychodzące wiadomości możesz trzymać w kolekcji i wyświetlać ich tylko tyle, ile się zmieści na obszarze dla nich przeznaczonym lub je przewijać.
Jeżeli chcesz to zrobić samodzielnie, to sprawdź mój przykład dopiero wtedy, gdy nie będziesz miał pomysłów jak to zrobić.
Kopiuj
var message = "";
var incomingMessagesCount = 0;
const int windowWidth = 80;
const int windowHeight = 25;
Console.SetWindowSize(windowWidth, windowHeight);
Console.SetCursorPosition(0, windowHeight);
while (true)
{
if (Console.KeyAvailable)
{
var consoleKey = Console.ReadKey(true);
if (consoleKey.Key == ConsoleKey.Backspace)
{
message = message.Substring(0, Math.Max(0, message.Length - 1));
}
else
{
message += consoleKey.KeyChar;
}
Console.SetCursorPosition(0, windowHeight - 1);
Console.Write(message.PadRight(windowWidth));
Console.SetCursorPosition(message.Length, windowHeight - 1);
}
if (new Random().Next(100) == 0)
{
var incomingMessage = "Hello World!";
Console.SetCursorPosition(0, incomingMessagesCount++);
Console.Write(incomingMessage);
Console.SetCursorPosition(message.Length, windowHeight - 1);
}
Thread.Sleep(50);
}