Console bei Esc schließen

Noctuh

Cadet 2nd Year
Registriert
Jan. 2020
Beiträge
28
Hallo,

ich habe folgendes Problem ich habe ein Verwaltungsprogramm in C# programmiert das über die Console ausgegeben wird. Nun soll egal wo im Programm sobald ich Esc drücke die Console schließen. Nun mein Problem ist ich habe einen Code dieser Funktioniert aber nur an der Stelle wo ich in hinschreibe und nicht über das ganze Programm kann mir jemand vielleicht sagen ob das am Code liegt oder ob ich ihn vielleicht nur an eine andere Stelle setzen muss.

Mein Code:

var key = Console.ReadKey();
if (key.Key == ConsoleKey.Escape)
{
Environment.Exit(0);
}

Ich bin dankbar für jede Hilfe.
Ergänzung ()

Also jetzt im Nachhinein werde ich wahrscheinlich den Code als Methode verpacken aber hat da einer Idee wie ich das machen könnte
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: adAstra
Hat mir leider nichts gebracht kenne mich mit Event leider noch gar nicht aus. Wäre es möglich mir es kurz und knapp zu erklären oder mir ein Beispiel zu geben damit ich weis wie ich es zu machen habe.

MfG

Noctuh
 
Console selbst unterstützt soweit ich weiß nur das CancelKeyPress Event, das ausgelöst wird, wenn CTRL+C gedrückt wird. KeyPress oder ein ähnliches Event gibt es für Console nicht - kann mich aber auch täuschen.

Eventuell ist ein Console-Projekt auch einfach nicht die richtige Lösung für dich. Ohne Details zu deinem Programm lässt sich das aber schlecht sagen.
 
Naja ich habe im Internet jetzt gelesen mit Console.ReadKey und dann halt wenn der Escape ist dann Console schließen aber ich weis nicht wie. Was für Details zu meinem Programm bräuchtest du den?
 
Dein Problem ist, dass du deine Tastatureingabe zu jeder Zeit parallel/asynchron zu deinem eigentlichen Programm abfangen musst. Du kannst also deinen Code nicht an eine beliebige Stelle packen und hoffen das dein Programm zufällig an der Stelle ist, wenn du ESC drückst.
Ich hab das allerdings noch nicht in einer Consolen-Anwendung eingesetzt, kann sein, dass das wie @Raijin sagt, da gar nicht geht.
Was meinst du mit "Console" schließen? Soll sich das Programm beenden oder nur im Hintergrund weiterlaufen?
Für ersteres nutz mann eigentlich Str+C, dass von Haus aus mit dem Befehl von @Raijin unerstützt wird. Da gibt es dann auch zahlreiche Beispiele im Netz, wie man das implementiert.
 
Ah sry hab mich bei meiner aufgabe verlesen. Also ich habe eine Menü mit 6 Punkten über die eingabe einer Zahl geh ich dann in die verschiedenen Punkte rein. Und wenn ich in so einem Menüpunkt bin und da Esc drücke soll ich dort egal wo ich gerade bin zum Hauptmenü zurückgekehrt werden.

Ist das möglich?
 
Was auf jeden Fall funktionien würde wäre eine Schleife zu bauen, die immer die ganze Inputs entgegen nimmt.
Ist der Input ESC, beende das Programm, ansonsten leite ihn an einen neuen InputStream weiter, Der dann vom Rest vom Programm genutzt wird.

Aber generell benutzt man in Der Konsole eher Strg+c

Raijin schrieb:
Console selbst unterstützt soweit ich weiß nur das CancelKeyPress Event, das ausgelöst wird, wenn CTRL+C gedrückt wird.
 
Ja aber bei mir in der Aufgabe geht es eben mit Esc ist es möglich iwas zu schreiben bei der bsp. Console.ReadKey benutzt wird und wenn es eben esc ist geht er in das Hauptmenü zurück
Ergänzung ()

Alles gut ist keine Hausaufgabe oder ähnliches ich lerne das Programmieren so das ist keine Hausaufgabe, Prüfungsaufgabe oder ähnliches um das zu beantworten
 
Ich bin mal so nett:
Statt Environment.Exit(0); muss da halt der Code hin, der dich in dein "Hauptmenü" bringt. Was das ist, wie du da hinkommst, das weißt nur du, du hast ja das Programm geschrieben.
 
Ja das habe ich jetzt auch schon aber ich weis nicht wo ich den Code platzieren soll denn, wenn ich z.B. den Code am Ende von Menüpunkt 1 setzte kann ich auch erst am Ende der Aufgabe Esc drücken und ich will ja aber an jeder beliebigen Stelle in Aufgabe 1 Esc drücken können und so zurück kommen
 
Events sind das Stichwort, wenn es darum geht, Funktionen asynchron auszulösen, wie @Nilson zitiert hat eben sowas wie Mausklicks oder eben auch Tasten. Wenn du in deinem Browser auf einen Button klickst, generiert das Betriebssystem eine Nachricht "Maus-Linksklick" und reicht diese Nachricht nebst Koordinaten an das aktive Fenster, den Browser. Der wiederum löst daraufhin das Skript aus, das hinter dem Button steht - sofern der Button auf einen Linksklick-Event reagiert. Bei Tasten ist es ähnlich. Eine Console-App ist aber .. .. .. sagen wir mal .. .. in der Funktion eingeschränkt. Das heißt leider auch, dass Events nur begrenzt möglich sind.

Ein üblicher Programmablauf für eine Console-App sieht daher so aus, dass dort die ganze Zeit eine Schleife ihre Runden dreht und bei jeder Iteration aktiv auf einen Tastendruck wartet, eben mit Console.ReadKey(). Diese Taste musst du dann auswerten, mit if, switch oder wie auch immer.

Die Folge dieser Herangehensweise ist aber, dass du nicht während der Schleife auf ein ESC reagieren kannst, weil das erst durch besagte ReadKey-Funktion überhaupt abgefragt wird. Willst du eine Aktion unterbrechen, habe ich dir das fragliche Event oben bereits genannt, das reagiert allerdings ausschließlich auf CTRL+C und nicht auf ESC oder sonstwas. CTRL+C ist ja auch das was man in der Eingabeaufforderung bei Windows drücken muss, um zB eine Batch oder einen Dauerping zu stoppen.

Nachtrag: Diese Vorgehensweise hatte @new Account() oben schon erwähnt, ist bei mir während des Tippens untergegangen ;)
 
  • Gefällt mir
Reaktionen: Nilson
Was hast du denn für schon für code? Eventuell können wir dann mehr sagen.
 
if (auswahlMenu == 1 || id == -1)
{
do
{
Console.Clear();
tmpPKW = new PKW();
tmpPKW.Id = id;
id++;
Console.WriteLine("Name des PKW eingeben");
tmpPKW.Description = Console.ReadLine();
Console.WriteLine("Tankkapazität eingeben");
tmpPKW.FuelCap = Convert.ToInt32(Console.ReadLine());
tmpPKW.Fuel = tmpPKW.FuelCap;
Console.WriteLine("Spritverbrauch eingeben");
tmpPKW.FuelConsum = Convert.ToDecimal(Console.ReadLine());
tmpPKW.MaxRange = Convert.ToInt32((tmpPKW.FuelCap / tmpPKW.FuelConsum) * 100);
Console.WriteLine("Gefahrene Strecke eingeben");
tmpPKW.DrivenKm = Convert.ToInt32(Console.ReadLine());
tmpPKW.TotalKm = 0;
tmpPKW.IsActive = true;
tmpPKW.IsInUse = false;
speicherungPKW.Add(tmpPKW);
Console.WriteLine("Möchten Sie noch ein Auto anlegen? j/n");
auswahl = Convert.ToChar(Console.ReadLine());

} while (auswahl == 'j');
}

Das ist der Code zu Aufgabe 1. Insgesamt gibt es 6 aufgabe und ein Hauptmenü um alles herum ist auch noch eine do while schleife damit sich das Programm nicht beendet. Und nun soll wenn ich bsp. in Aufgabe 1 bin und Esc drücke zurück zum Hauptmenü kommen
Ergänzung ()

Danke [U][LEFT][B][SIZE=4][FONT=Segoe UI][COLOR=rgb(24, 53, 95)]Raijin[/COLOR][/FONT][/SIZE][/B][/LEFT][/U] könntest du mir vielleicht mal ein kleines Event Programmieren nicht mit meinem Zeug einfach iwas damit ich mal sehen wie das Aufgebaut ist wäre sehr hilfreiche.

Danke.
 
Pack das bitte mal in [CODE=csharp][/CODE] Klammern, damit man das auch lesen kann ;)
 
  • Gefällt mir
Reaktionen: Raijin
[
if (auswahlMenu == 1 || id == -1)
{
do
{
Console.Clear();
tmpPKW = new PKW();
tmpPKW.Id = id;
id++;
Console.WriteLine("Name des PKW eingeben");
tmpPKW.Description = Console.ReadLine();
Console.WriteLine("Tankkapazität eingeben");
tmpPKW.FuelCap = Convert.ToInt32(Console.ReadLine());
tmpPKW.Fuel = tmpPKW.FuelCap;
Console.WriteLine("Spritverbrauch eingeben");
tmpPKW.FuelConsum = Convert.ToDecimal(Console.ReadLine());
tmpPKW.MaxRange = Convert.ToInt32((tmpPKW.FuelCap / tmpPKW.FuelConsum) * 100);
Console.WriteLine("Gefahrene Strecke eingeben");
tmpPKW.DrivenKm = Convert.ToInt32(Console.ReadLine());
tmpPKW.TotalKm = 0;
tmpPKW.IsActive = true;
tmpPKW.IsInUse = false;
speicherungPKW.Add(tmpPKW);
Console.WriteLine("Möchten Sie noch ein Auto anlegen? j/n");
auswahl = Convert.ToChar(Console.ReadLine());

} while (auswahl == 'j');
}
]
Ergänzung ()

Hä Eckige-Klammern oder wie funktioniert das wenn ich so dumm fragen darf?
 
Wie ich schon schrieb, Events in Console-Apps gibt's in der Form nicht. Wenn, müsste man direkt auf die Hooks des Betriebssystem gehen und das sprengt den Rahmen doch deutlich und geht auch weit am Thema der Aufgabe vorbei....

Von deinem Code ausgehend ist "auswahlMenu" wohl die Variable, die festhält, in welchem Menü du dich befindest. Wenn du nun im PKW-Menü ESC drückst - also ReadKey mit ESC vergleichst - muss sich die PKW-Schleife beenden (zZt tut sie das bei allem außer "j") und das "auswahlMenu" zurückgesetzt werden, weil du sonst durch die übergeordnete Schleife (die wir hier nicht sehen) vermutlich wieder in auswahlMenu=1, dem PKW-Menü landest.
.

@Nilson meinte das mit den Tags übrigens so:

C#:
if (auswahlMenu == 1 || id == -1)
{
   do
   {
      Console.Clear();
      tmpPKW = new PKW();
      tmpPKW.Id = id;
      id++;
      Console.WriteLine("Name des PKW eingeben");
      tmpPKW.Description = Console.ReadLine();
      Console.WriteLine("Tankkapazität eingeben");
      tmpPKW.FuelCap = Convert.ToInt32(Console.ReadLine());
      tmpPKW.Fuel = tmpPKW.FuelCap;
      Console.WriteLine("Spritverbrauch eingeben");
      tmpPKW.FuelConsum = Convert.ToDecimal(Console.ReadLine());
      tmpPKW.MaxRange = Convert.ToInt32((tmpPKW.FuelCap / tmpPKW.FuelConsum) * 100);
      Console.WriteLine("Gefahrene Strecke eingeben");
      tmpPKW.DrivenKm = Convert.ToInt32(Console.ReadLine());
      tmpPKW.TotalKm = 0;
      tmpPKW.IsActive = true;
      tmpPKW.IsInUse = false;
      speicherungPKW.Add(tmpPKW);
      Console.WriteLine("Möchten Sie noch ein Auto anlegen? j/n");
      auswahl = Convert.ToChar(Console.ReadLine());
   } while (auswahl == 'j');
}
 
Einfach den Teil von mir oben Kopieren und zwischen [CODE=csharp]und[/CODE] deinen Code kopieren, oder über:

Capture.PNG
 
Ja genau wenn ich im Hauptmenü 1 drücke komme ich in das Menü das man hier sieht um den PKW anzulegen und am schluss wird man eben gefragt ob man noch eine auto anlegen will und wenn man ja drückt kommt man zum Anfang und wenn man etwas anderes eingibt dann kommt man zurück zum Hauptmenü
 
Zurück
Oben