Entwickler-Ecke
WinForms - KeyDown Event
MarcusDidius - Sa 05.11.11 19:27
Titel: KeyDown Event
Hallo ich versuche das KeyDown Event einer Form zu behandeln.
(Ich versuche das letzte Beispiel aus "Heard First C#" aus Kapitel 4 nachzukochen)
Dazu habe ich auf der Form den EventListener KeyDown angelegt.
Wenn ich das Programm laufen lasse reagiert es nicht auf Tastatureingaben.
Ich habe einen Breakpoint in dem EventListener gesetzt und sehe dass die Methode nie aufgerufen wird.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| namespace TypingGame { public partial class Form1 : Form { Random random = new Random(); Stats stats = new Stats();
public Form1() { InitializeComponent(); }
private void timer1_Tick(object sender, EventArgs e) { listBox1.Items.Add((Keys)random.Next(65, 90)); if (listBox1.Items.Count > 7) { listBox1.Items.Clear(); listBox1.Items.Add("Game Over"); timer1.Stop(); } }
private void Form1_KeyDown(object sender, KeyEventArgs e) { if (listBox1.Items.Contains(e.KeyCode)) { listBox1.Items.Remove(e.KeyCode); listBox1.Refresh(); if (timer1.Interval > 400) { timer1.Interval -= 10; } if (timer1.Interval > 250) { timer1.Interval -= 7; } if (timer1.Interval > 100) { timer1.Interval -= 2; } difficultyProgressBar.Value = 800 - timer1.Interval; stats.Update(true); } else { stats.Update(false); } correctLabel.Text = "Correct: " + stats.Correct; missedLabel.Text = "Missed: " + stats.Missed; totalLabel.Text = "Total: " + stats.Total; accuracyLabel.Text = "Accuracy: " + stats.Accuracy + " %"; } } } |
Wenn ich runtergeladene Lösung aus dem Buch laufen lasse funktioniert das Programm, aber ich kann keine Unterschiede im Quellcode finden.
Hat jemand eine Ahnung an was das liegen könnte? Muss ich irgendwelche Properties modifizieren damit auf Tastatureingaben reagiert wird?
Vielen Dank für jeden Hinweis,
Hans
pdelvo - Sa 05.11.11 19:38
Du hast keinen Event Handler registriert. Das machst du entweder im Designer(so wird es im Beispiel warscheinlich sein), oder du schreibs z.B. in den Konstruktor:
C#-Quelltext
1:
| KeyDown += Form1_KeyDown; |
Dann sollte es funktionieren.
So steht die Methode dort drin und das Form weiss nicht, dass es sie aufrufen soll
MarcusDidius - Sa 05.11.11 19:52
Hat eigenlicht schon der Designer gemacht:
C#-Quelltext
1: 2: 3: 4:
| private void InitializeComponent() { this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown); |
Ich habe eine ListBox auf der Form. Kann es sein, dass die die Events irgenwie "schluckt"?
Danke,
Hans
Troubadix - Sa 05.11.11 21:28
Hallo MarcusDidius.
Hast Du in deiner Form die Eigenschaft KeyPreview auf true stehen? Wenn nicht geht das Key Event an das Element auf der Form das gerade den Focus hat.
Und nicht Vergessen e.handled auf true zu setzen wenn Du den Tastendruck in deinem Event abgefangen hast.
Gruß
Troubadix
MarcusDidius - So 06.11.11 18:59
KeyPreview = True
hats gelöst.
Vielen Dank!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!