Entwickler-Ecke

Basistechnologien - Tastenkombination Problem


lamda - So 14.02.10 20:10
Titel: Tastenkombination Problem
Hi
Ich hab ein Problem und zwar beim abfangen der Tasten eingaben, es funktioniert soweit auch nur mit den Pfeiltasten hab ich noch mühe.


C#-Quelltext
1:
2:
 if (e.KeyData == (Keys.A | Keys.B | Keys.C))
textBox1.Text = "abc";

Das funktioniert!


C#-Quelltext
1:
2:
if (e.KeyData == (Keys.Up | Keys.Right))
textBox1.Text = "oben rechts";

Das nicht, wenn nicht nach Rechts klicke erscheint der Text.


C#-Quelltext
1:
2:
if (e.KeyData == (Keys.Up | Keys.Left))
textBox1.Text = "oben links";

Bei dem das selbe wenn ich nach Rechts klicke erscheint der Text.

Funktioniert das mit dieser Methode überhaupt?

Diese Hotkeys müssen nur funktionieren wenn die Form offen ist.

Danke im Voraus

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


JüTho - So 14.02.10 21:49

Hallo und :welcome:

Das ist eine falsche Formulierung der oder-Bedingung. Du musst es trennen (jede Bedingung separat und dann verknüpfen):

C#-Quelltext
1:
2:
if(e.KeyData == Keys.Up || e.KeyData == Keys.Right))
  textBox1.Text = "oben rechts";

Es ist sozusagen Zufall, dass deine Variante überhaupt kompiliert wurde und in einem Fall sogar ein richtiges Ergebnis liefert.

Jürgen


lamda - So 14.02.10 22:10

Es soll aber nur in die if wenn beide Tasten gedrückt wurden nicht nur eine.
Mit && funktioniert es nicht, mit | funktioniert es bei normalem Text.


Laurence - So 14.02.10 22:20

Mhh, eigentlich müsste es funktionieren, oder?
Ich hab mal folgende Seite hier gefunden:
http://www.multidata.at/SitesMD/Doc_VisualCSharp/visual_csharp_15_001.htm

Ausschnitt:
Zitat:
... Sehen wir uns nun an einem Beispiel an, wie einfach eine bestimmte Tastenkombination abgefragt werden kann. Ausgangspunkt sei die Forderung, mit der Tastenkombination Shift + Alt + F9 das aktuelle Formular zu schließen:


C#-Quelltext
1:
2:
3:
private void Form1_KeyDown(object sender, KeyEventArgs e) { 
  if(e.KeyData == (Keys.Shift | Keys.Alt | Keys.F9)) 
    this.Close();_$ret_}


Es werden die Keys-Werte der gewünschten Kombination mit dem bitweisen ODER-Operator verknüpft und das Ergebnis mit dem aktuellen Inhalt von KeyData verglichen. Stimmt die gewünschte Tastenkombination mit dem vorliegenden Bitmuster überein, wird die Methode Close auf das aktuelle Form-Objekt aufgerufen. ...


Vielleicht hilft das!
Gruß


lamda - So 14.02.10 22:51

Ja mit Shift Alt und F9 funktioniert es nur mit den Pfeiltasten nicht richtig. Nur einzelne Pfeiltasten können richtig "gelesen" werden.


Kha - So 14.02.10 23:05

KeyDown für jede Taste einzeln gefeuert und in den EventArgs steht auch immer nur diese eine Taste (abgesehen eben von Strg etc.). Du musst dir also überlegen, wie du dir merken kannst, dass beim Drücken der zweiten Taste KeyDown bereits für die erste gefeuert wurde (und auch noch kein KeyUp dafür aufgetreten ist).

Eine Alternative wäre noch GetKeyState aus der Win-API: http://sanity-free.org/17/obtaining_key_state_info_in_dotnet_csharp_getkeystate_implementation.html

PS: @user profile iconlamda - :welcome:
Soll dein Nickname eigentlich an einen gewissen Buchstaben erinnern ;) ?


lamda - So 14.02.10 23:19

Versuch mich gerade daran, 2 Bool Variablen zu deklarieren und bei KeyDown wird die Variabel auf True gesetzt, bei KeyUp auf false.

Wie kann ich in der Main funktion immer nachfragen ob diese Variablen auf true sind? Wenn ich eine While mache gibt es eine Endlosschlaufe und das Programm stürzt ab.

@Kha Der Name kommt aus dem Griechischen. Weil ich keine Alpha oder Beta will sondern die Lamda Version. :-P


Kha - Mo 15.02.10 19:08

user profile iconlamda hat folgendes geschrieben Zum zitierten Posting springen:
Versuch mich gerade daran, 2 Bool Variablen zu deklarieren und bei KeyDown wird die Variabel auf True gesetzt, bei KeyUp auf false.
Das ist der richtige Weg :D . Aber warum willst du sie in der Main abfragen, warum nicht direkt dort, wo du sie auf true setzt?

user profile iconlamda hat folgendes geschrieben Zum zitierten Posting springen:
@Kha Der Name kommt aus dem Griechischen.
Oh, dass die Schreibweise quasi die offizielle Übersetzung ist, wusste ich noch nicht :) .