2010-03-23 4 views
2

J'ai fait une application de test simple pour le problème, deux winforms contenant chacune un bouton. Le bouton sur le premier formulaire ouvre l'autre formulaire lorsque vous cliquez dessus. Il s'abonne également aux événements keyup.KeyUp traité pour un mauvais contrôle

La deuxième forme a son bouton défini comme « AcceptButton » et en cas cliquée nous dormons pendant 1 seconde puis définissez DialogResult true (le sommeil est de simuler un certain traitement effectué)

Lorsque la touche ENTER est utilisée pour fermer cette deuxième forme l'événement KeyUp du bouton sur le premier formulaire est déclenché, même si la clé a été libérée bien avant que la seconde ne soit passée, ainsi la deuxième forme était toujours montrée et focalisée.

Si une touche autre que l'entrée est enfoncée dans la deuxième forme, l'événement n'est pas déclenché pour le bouton sur le premier formulaire.

Première forme:

public Form1() 
    { 
     InitializeComponent(); 
     buttonForm2.KeyUp += new KeyEventHandler(cntKeyUp); 
    } 

    void cntKeyUp(object sender, KeyEventArgs e) 
    { 
     MessageBox.Show(e.KeyCode.ToString()); 
    } 

    private void buttonForm2_Click(object sender, EventArgs e) 
    { 
     using (Form2 f = new Form2()) 
     { 
      f.ShowDialog(); 
     } 
    } 

Deuxième forme:

private void button1_Click(object sender, EventArgs e) 
    { 
     Thread.Sleep(1000); 
     this.DialogResult = DialogResult.OK; 
    } 

Est-ce que quelqu'un sait pourquoi l'événement est déclenché pour le bouton sur la forme non active et ce qui peut être fait pour empêcher que cela se produise ?

+0

Le problème a été résolu en ajoutant un gestionnaire KeyDown à Form1, l'événement keyup vérifie ensuite que la KeyValue de EventArgs correspond à celle définie par KeyDown, qui est ensuite effacée. Si l'événement KeyUp a été déclenché par un autre dialogue, la valeur KeyDown ne sera jamais définie et nous savons qu'aucune action ne doit être effectuée. Invoquer dans la deuxième forme comme suggéré par SLaks est une solution potentielle dans le petit cas de test mais dans l'application réelle, il est trop facile d'oublier de le faire dans un ou plusieurs dialogues. – Mikael

Répondre

3

Vous effectuez un appel de blocage, puis fermez le formulaire avant l'envoi du message WM_KEYUP.

Au moment où le message est envoyé, la deuxième forme a disparu, de sorte que le contrôle actuellement ciblé est sur le premier formulaire.

Vous pouvez résoudre ce problème en appelant BeginInvoke dans le gestionnaire de clic de la deuxième forme seulement cacher la forme dans la boucle de message suivant (après la KeyUp)

0

Une façon de contourner:

Vous pouvez vérifier dans cntKeyUp si l'expéditeur est le formulaire que vous attendez alors vous le traitez, sinon ignorez.

+0

L'expéditeur est le bouton sur Form1 en d'autres termes celui que je suis intéressé à écouter. Donc ça ne marche pas. – Mikael

Questions connexes