2009-04-28 5 views
3

Selon le official documentation, l'événement KeyDown sur un contrôle Windows Forms se produit qu'une seule fois, mais il est facile de démontrer que l'événement se déclenche aslong sans cesse comme touche est maintenue:Comment puis-je empêcher l'événement keydown d'un formulaire en C# de tirer plus d'une fois?

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

Comment pouvez-vous consommer le événement de sorte qu'il ne tire qu'une seule fois?

+3

Pouvez-vous utiliser l'événement KeyUp à la place? – Groo

+0

Voir le commentaire sur la réponse de Stevo3000. Merci –

Répondre

2

Je suis généralement un type VB, mais cela semble fonctionner pour moi comme code de démonstration, en utilisant le formulaire lui-même comme la source d'entrée:

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; 
      } 
     } 
    } 
} 

Je pense que la logique est un peu peu précis si vous Si vous maintenez plusieurs touches à la fois, mais cela semble déclencher l'événement à partir de la dernière touche qui a été pressée de toute façon, donc je ne pense pas que cela devienne un problème.

J'ai testé cela dans un TextBox dans VB, et cela a fonctionné correctement. Je n'étais pas sûr des conventions d'héritage que je devrais suivre dans C#, donc je l'ai laissé comme une forme droite pour cette réponse.

Toutes mes excuses pour toute erreur grossière de formatage de code, encore une fois, ce n'est pas ma langue habituelle.

+0

Merci Frosty840! Désolé de devoir utiliser une variable globale, cependant. –

0

Vous pouvez remplacer une méthode ProcessCmdKey.

2

puisque l'occupation multiple de KeyDown est due aux paramètres Keyrepeat de Windows, je pense que vous devriez en quelque sorte suivre l'événement KeyUp de cette clé pour savoir aussi que la clé a été libérée.

0

vous pouvez utiliser un compteur!

2

Utilisez le raccourci clavier.

+0

Je veux une fonctionnalité de type oeuf de pâques à activer si l'utilisateur appuie sur une touche pendant plus de 5 secondes. Donc, KeyUp n'est pas une option. –

+0

@JannieT - Enregistrez l'heure du keydown, puis traitez-la quand le keyup est déclenché. – stevehipwell

+0

Pouvez-vous faire cela sans introduire une variable globale (portée de classe)? –

Questions connexes