Console App c# warten bis ein Key gedrückt wird?

2 Antworten

Wenn das Fenster nicht aktiv ist, dann geht das mit keyboard hooks, z.B.: (hab mir das Beispiel nicht genau angesehen)

https://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook

Oder such dir ne andere Lösung raus:

https://duckduckgo.com/?q=%22keyboard+hook%22+c%23

Woher ich das weiß:Studium / Ausbildung – Datenverarbeitungs-Kfm, Hobby- und Profi-Programmierer
Erzesel  02.04.2022, 00:13

Mit Global Hooks kann man sein System richtig Klasse abschießen ...

0
DonkeyShot  02.04.2022, 00:37
@Erzesel

Ja kann man. Aber ist halt die Antwort auf die Frage. :) Ich sehe mich nicht dafür verantwortlich, das in allen Belangen zu diskutieren. Aber es ist natürlich völlig ok, das zu machen.

1
Palladin007  02.04.2022, 01:09
@DonkeyShot

Prinzipiell stimme ich dir zu, aber eine Warnung sollte denke ich schon drin sein :)

Wer die Warnung dann ignoriert ... naja, selber schuld.

1
Von Experte Palladin007 bestätigt

DonkeyShots Ansatz ist eigentlich optimal... aaaaaber!....

Globale Hooks sind ein heißes Eisen für jemanden der fragen muss wie man solch ein Problem löst.

Die Leute welche den Code handhaben wie Butterbrot sind sich in der Regel im klaren, das man dergleichen unmanaged Code (Marshalling) auch ordentlich zurücksetzen/freigegeben muss. (C# räumt nur seinen Kram auf, aber nicht was Du mit Marshalling veranstaltest)

Was passiert, wenn Du Dein Programm einfach beendet, ohne ordentlich aufzuräumen?

  • Dein Callbackpointer bleibt Handler des Systems eingetragen...
  • Nach beenden des Programms kann der compilierte Maschinencode durchaus noch mit viel Glück im RAM bleiben... (dass jedoch freigegeben ist) solange passiert ersmal nichts...
  • Irgendwann wird dieser Bereich aber überschrieben, dann steht an der Stelle, auf die der Callbackpointer zeigt auf die gleiche Stelle, aber dort können jetzt die Daten eines Bildes lagern (oder was auch immer... )
  • Bluscreen... weil dann wohl auch irgendwas chaotischen vom Prozessor gelesen wird...

Wenn Du mit dergleichen experimentieren, Sorge dafür das nicht gerade irgendwelche Updates laufen, oder wichtige Sachen auf das Systemlaufwerk geschrieben werden.

Ansonsten Backup bereithalten...!

Eine "Anfängerfreundliche" Option wäre das einrichten eines FilesystemWatchers. Dieser würde reagieren wenn eine bestimmte Datei erzeugt wird. Wenn die Datei FlagFile.txt erzeugt wird beendet sich das Hintergrundprogramm. Und wie man Dateien erzeugt und Löscht ist Kinderkram.

Das ist absolut billig und das schone ist, FSWatcher ist Managed Code und wird beim beenden des Programms von der .Net-Runtime komplett "saubergeputzt"

Das mit der Flagdatei ist so narrensicher, das wir es vor Jahrzehnten sogar in Sprachen wie Batch oder VBS nutzen um hidden Prozessen ein Signal zu geben...

Palladin007  02.04.2022, 00:32

Woher weißt Du, dass es nur darum geht, dem Prozess ein Signal zu geben? :P
Kommt ja immer mal wieder vor, dass ein Witzbold mein, einen KeyLogger oder dergleichen schreiben zu wollen.

Aber natürlich hast Du Recht, Hooks sind eine unangenehme Angelegenheit.

Ich erinnere mich aber dunkel an einen anderen Weg, der - laut Microsoft - nicht ganz so riskant und deutlich performanter sein soll. Man arbeitet dann nicht mit den Hooks, sondern direkt mit der Hardware-API, die Windows darunter verwendet.
Ist aber lange her und ich find's gerade nicht mehr - kann also auch Quatsch sein.

1
Erzesel  02.04.2022, 01:21
@Palladin007
Woher weißt ...

Glaskugel 🤪

Schuss ins Blaue ...? (Console.ReadKey() nutzt man eigentlich eher selten um ernsthaft auf Daten zu warten... In der Regel Abbruchbedingung für eine Endlosschleife)

1