Entwickler-Ecke
WinForms - Tastaturevent abfangen
garv3 - So 30.08.09 01:53
Titel: Tastaturevent abfangen
Hallo zusammen!
Ich würde gerne abfangen, wenn eine beliebige Taste aus der Tastatur gedrückt wurde, während meine Anwendung läuft.
Dabei würde ich dann gerne überprüfen, um welche Taste es sich handelt.
Wie geht das am leichtesten?
Dank und Gruß
garv3
garv3 - So 30.08.09 16:35
Ich habe nun in den Code (Form1.cs) folgende Methode eingefügt:
C#-Quelltext
1: 2: 3: 4:
| private void OnKeyPressHandler(object sender, KeyPressEventArgs e) { KellnerTextbox.Text = "Pressed"; } |
In den Eigenschaften des Form1 habe ich im Entwurf-Reiter das Event KeyPress auf OnKeyPressHandler gesetzt.
Eigentlich sollte jetzt doch bei jedem Tastendruck innerhalb der Anwendung die Methode aufgerufen werden, oder? Jedenfalls wird KellnerTextbox.Text nie auf "Pressed" gesetzt.
Jemand eine Idee?
Moderiert von
Christian S.: C#-Tags hinzugefügt
Ralf Jansen - So 30.08.09 16:54
Key Events gehen direkt an das Control das gerade den Focus hat. Also normalerweise an der Form vorbei. Somit ist dein beobachtetes Verhalten erstmal normal.
Wenn du diese Events trotzdem für eine Form zentral behandeln möchtest mußt du noch die KeyPreview Property der Form auf true setzen.
garv3 - So 30.08.09 16:58
Hey, es funktioniert!
Tausend dank!!!
garv3 - Mo 31.08.09 00:15
So, habe nun noch ein kleines Problem:
Ich muss abfangen, ob die Tab-Taste gedrückt wurde.
Ich habe es mit folgendem Code probiert:
C#-Quelltext
1: 2: 3: 4:
| if (e.KeyChar == (Char)Keys.Tab) { this.Close(); } |
Leider funktioniert das nicht.
Mit einigen anderen Tasten geht es. Z.B. mit ESC:
C#-Quelltext
1: 2: 3: 4:
| if (e.KeyChar == (Char)Keys.Escape) { this.Close(); } |
Jemand ne Idee?
Daaaanke!
JüTho - Mo 31.08.09 10:29
In der
SDK-Doku/MSDN steht:
Zitat: |
Tastaturereignisse treten in der folgenden Reihenfolge ein:
* KeyDown
* KeyPress
* KeyUp |
In den Erläuterungen findest du Hinweise, wann und wie spezielle Tasten wie Eingabetaste, TAB, ESC bearbeitet und abgefragt werden können.
Jürgen
garv3 - Mo 31.08.09 17:22
Hmm.
Ich hab mich da mal kurz eingelesen... Heißt das etwa, dass ich für jedes Element meines Formulars die entsprechende Klasse überschreiben muss?
Das wäre ja mal heftig! Es sind sooo viele Elemente, dass das eine Ewigkeit dauern würde.
Gibt es keinen einfacheren weg, diese Events immer abzufangen?
Ich möchte, dass die TAB-Taste kein anderes Event auslöst, als das von mir erstellte. Unabhängig davon, welches Element fokussiert ist!
Ralf Jansen - Mo 31.08.09 17:41
Zitat: |
Ich hab mich da mal kurz eingelesen... Heißt das etwa, dass ich für jedes Element meines Formulars die entsprechende Klasse überschreiben muss? |
Ich weiß nicht was du gelesen hast, wenn du die Hilfe zum KeyPress Event meinst solltest du eigentlich gelesen haben das der nur für
druckbare Zeichen gefeuert wird. TAB ist kein druckbares Zeichen. Du müßtest also theoretisch zum abfangen auf die KeyUp/KeyDown Events umsteigen. Wobei das wirklich nur theoretisch ist. Da an TAB bereits eine Systemfunktion hängt(Focuswechsel) greift diese zuerst.
Wenn du unbedingt TAB abfangen willst (Sicher? TAB ist wie gesagt eine Systemfunktion. User haben da gewisse Erwartung was TAB macht) mußt du wahrscheinlich wirklich die Controls ableiten und ProcessDialogKey und/oder IsInputKey entsprechend deinen Wünschen implementieren.
garv3 - Mo 31.08.09 23:02
Ja, mein Problem war ja die an TAB angehängte Systemfunktion.
Ich hab das Problem allerdings anders lösen können, indem ich die Hardware, welche die Tastaturevents sendet, umprogrammiert habe.
Danke trotzdem!!!
Ccenter - Fr 18.09.09 21:55
Hallo,
tut mir leid das ich diesen, schon etwas älteren, Beitrag "rauskrame" aber ich habe zu dem Thema mal eine Frage:
Wenn ich folgendes schreibe if (e.KeyChar == (char)Keys.A && (char)Keys.E)
bekomme ich einen Compilerfehler "Der Operator "&&" kann nicht auf Operanden vom Typ "bool" und "char" angewendet werden."
Wie müsste das heißen, damit es funktioniert?
Robert.Wachtel - Fr 18.09.09 22:05
Selbst wenn es funktionieren sollte, was willst Du denn eigentlich erreichen?
Möchtest Du prüfen, ob entweder A
oder E gedrückt wurden, dann hilft Dir eine korrekte Klammerung:
C#-Quelltext
1:
| if ((e.KeyChar == (char)Keys.A) || (e.KeyChar == (char)Keys.E)) |
Ccenter - Sa 05.12.09 12:32
Ok danke.
Ich möchte aber abfragen ob 2 Tasten gleichzeitig gedrückt werden. Also ob eine Tasenkombination gerade betätigt wird. Deshalb auch && und nicht ||.
Wenn ich diesen Code hier verwende:
C#-Quelltext
1: 2: 3: 4:
| if ((e.KeyCode == Keys.A) && (e.KeyCode == Keys.E)) { MessageBox.Show("tastenkombination wurde gedrückt"); } |
bekomme ich zwar keine Fehlermeldung aber ich es passiert auch nichts. Wenn ich statt A und E nur E verwende funktioniert es aber.
JüTho - Sa 05.12.09 14:08
Hallo,
das Problem liegt darin, wie die Ereignisse ausgelöst werden. In dem Moment, wo 'A' gedrückt wird, wird KeyPress mit der Information 'A' ausgelöst. In dem Moment, wo 'E' gedrückt wird, wird KeyPress mit der Information 'E' ausgelöst - unabhängig davon, ob 'A' weiterhin gedrückt wird oder losgelassen wurde.
Die Lösung kann nur so gelingen, dass das Formular sich in einer weiteren Variablen merkt, ob eine Taste gedrückt wird; durch KeyUp kann festgestellt werden, wenn sie losgelassen wird.
Ein anderes, einfacheres Vorgehen ist mit den Modifizierer-Tasten Shift, Strg, Alt möglich, die über KeyEventArgs direkt abgefragt werden können.
Gruß Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!