Autor Beitrag
garv3
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 30.08.09 01:53 
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 30.08.09 16:35 
Ich habe nun in den Code (Form1.cs) folgende Methode eingefügt:

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 30.08.09 16:58 
Hey, es funktioniert!

Tausend dank!!!
garv3 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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:
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
if (e.KeyChar == (Char)Keys.Escape)
{
    this.Close();
}


Jemand ne Idee?

Daaaanke!
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
if ((e.KeyChar == (char)Keys.A) || (e.KeyChar == (char)Keys.E))					
Ccenter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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