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 ?
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