Kapitel: Mein erstes Programm

Drück eine beliebige Taste

Befehl: Console.ReadKey

Du kennst Lass mich etwas eingeben schon aus dem Kapitel Konsole - dort liest Console.ReadLine() immer eine ganze Zeile ein und wartet dabei auf Enter. Jetzt, wo du auch Bedingungen und Schleifen kennst, schauen wir uns ein zweites Konsolen-Werkzeug an: Manchmal willst du gar keinen ganzen Text, sondern nur wissen, welche Taste gerade gedrückt wurde - ohne dass extra Enter gedrückt werden muss. Dafür gibt es Console.ReadKey().

Es gibt in C# kein Console.ReadChar() - so eine Methode existiert nicht. Es gibt Console.Read(), das zwar auch nur ein einzelnes Zeichen liefert (als Zahl, nicht als char), dabei aber trotzdem auf Enter wartet - also eigentlich das gleiche Problem wie ReadLine hat. Für einen einzelnen Tastendruck ohne Enter ist Console.ReadKey() die richtige Wahl.

Console.ReadKey

Console.ReadKey() hält dein Programm an und wartet auf genau einen Tastendruck - sobald eine Taste gedrückt wird, geht es sofort weiter. Kein Enter nötig.

Console.WriteLine("Drück eine beliebige Taste...");
Console.ReadKey();

Praktisches Beispiel: Zum Beenden eine Taste drücken

Ein sehr häufiger Einsatzzweck: Am Ende eines Programms dafür sorgen, dass das Konsolenfenster nicht sofort wieder verschwindet, bevor du die Ausgabe überhaupt lesen konntest.

Console.WriteLine("Fertig!");
Console.WriteLine("Zum Beenden eine beliebige Taste drücken...");
Console.ReadKey(true);
Console.ReadKey(true) - also mit true als Argument - zeigt die gedrückte Taste nicht extra in der Konsole an. Praktisch bei diesem Beispiel, denn hier interessiert uns ja nicht, welche Taste gedrückt wurde, sondern nur dass überhaupt eine gedrückt wurde.

Herausfinden, welche Taste gedrückt wurde

Willst du wissen, welche Taste es war, speicherst du das Rückgabeergebnis von Console.ReadKey() in einer Variable. Mit .KeyChar bekommst du davon das eingetippte Zeichen:

Console.Write("Drück eine Taste: ");
ConsoleKeyInfo taste = Console.ReadKey();
Console.WriteLine();
Console.WriteLine("Du hast " + taste.KeyChar + " gedrückt.");
Das Console.WriteLine(); ohne Argumente sorgt nur für einen Zeilenumbruch. Ohne intercept (also ohne true) zeigt ReadKey die gedrückte Taste nämlich direkt in der gleichen Zeile an wie deine Frage - ohne den zusätzlichen Zeilenumbruch würde die nächste Ausgabe direkt dahinter kleben.

Rückblick: Der Taschenrechner

Erinnerst du dich an Schritt 2 im Was können wir schon? Ein Taschenrechner? Dort haben wir das Rechenzeichen mit Console.ReadLine()[0] eingelesen - also eine ganze Zeile gelesen und dann nur das erste Zeichen davon verwendet. Mit dem, was du jetzt über ReadKey weisst, geht das auch direkter:

Console.Write("Rechenzeichen (+ - * /): ");
char operatorZeichen = Console.ReadKey().KeyChar;
Console.WriteLine();
Der Unterschied: Bei Console.ReadLine()[0] muss zuerst noch Enter gedrückt werden, bevor dein Programm weitermacht. Bei Console.ReadKey().KeyChar reagiert dein Programm sofort auf den einen Tastendruck - für ein einzelnes Rechenzeichen eigentlich die passendere Wahl. Die Prüfung mit switch, ob es wirklich + - * oder / war, bleibt dabei genau gleich.

Kurz zusammengefasst: Console.ReadKey() wartet auf genau einen Tastendruck, ganz ohne Enter - praktisch für "beliebige Taste drücken"-Meldungen oder für einzelne Zeichen wie ein Rechenzeichen. Mit .KeyChar holst du dir das eingetippte Zeichen, mit dem optionalen Argument true unterdrückst du die Anzeige der gedrückten Taste.

Weiter geht's mit: Zu viel Text