2009-04-28 10 views
3

Nach dem official documentation, das KeyDown-Ereignis auf einem Windows Forms-Steuerelement nur einmal vorkommt, aber es ist leicht zu zeigen, dass das Ereignis ausgelöst wird ständig aslong als Taste gedrückt gehalten wird:Wie kann ich verhindern, dass das Keydown-Ereignis eines Formulars in C# mehr als einmal ausgelöst wird?

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     label1.Text = string.Format("{0}", globalCounter++); 
    } 

Wie können Sie verbrauchen die Ereignis, so dass es nur einmal feuert?

+3

Können Sie stattdessen das KeyUp-Ereignis verwenden? – Groo

+0

Siehe die Antwort von Stevo3000. Danke –

Antwort

2

Ich bin im Allgemeinen ein VB-Typ, aber dies scheint für mich als Demo-Code zu arbeiten, das Formular selbst als Eingangsquelle:

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private bool _keyHeld; 
     public Form1() 
     { 
      InitializeComponent(); 
      this.KeyUp += new KeyEventHandler(Form1_KeyUp); 
      this.KeyDown += new KeyEventHandler(Form1_KeyDown); 
      this._keyHeld = false; 
     } 

     void Form1_KeyUp(object sender, KeyEventArgs e) 
     { 
      this._keyHeld = false; 
     } 

     void Form1_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (!this._keyHeld) 
      { 
       this._keyHeld = true; 
       if (this.BackColor == Control.DefaultBackColor) 
       { 
        this.BackColor = Color.Red; 
       } 
       else 
       { 
        this.BackColor = Control.DefaultBackColor; 
       } 
      } 
      else 
      { 
       e.Handled = true; 
      } 
     } 
    } 
} 

ich denke, die Logik ein wenig lückenhaft wird, wenn Sie‘ Sie halten mehrere Tasten gleichzeitig gedrückt, aber das scheint nur das Ereignis auszulösen, das von der letzten Taste stammt, die gedrückt wurde. Daher glaube ich nicht, dass dies ein Problem wird.

Ich habe dies in einer TextBox in VB getestet, und es hat gut funktioniert. Ich war mir nicht sicher, auf die Erbschaftskonventionen, die ich in C# folgen sollte, also verließ ich es als eine gerade Form für diese Antwort.

Entschuldigung für alle Code-Formatierungsfehler, dies ist nicht meine übliche Sprache.

+0

Danke Frosty840! Tut mir leid, dass ich eine globale Variable verwenden muss. –

0

Sie können eine ProcessCmdKey-Methode überschreiben.

2

Da das mehrfache Auftreten von KeyDown auf die Schlüsselwiederholungseinstellungen von Windows zurückzuführen ist, denke ich, dass Sie das KeyUp-Ereignis dieses Schlüssels irgendwie verfolgen sollten, um zu wissen, dass der Schlüssel freigegeben wurde.

0

können Sie einen Zähler verwenden!

2

Verwenden Sie KeyUp.

+0

Ich möchte eine Easter-Ei wie Feature aktiviert werden, wenn der Benutzer eine bestimmte Taste länger als 5 Sekunden gedrückt halten. KeyUp ist also keine Option. –

+0

@JannieT - Notieren Sie sich die Zeit des Keydowns und verarbeiten Sie diese dann, wenn die Tastaturauslösung ausgelöst wird. – stevehipwell

+0

Können Sie dies tun, ohne eine globale Variable (Klassenbereich) einzuführen? –

Verwandte Themen