J'ai essayé ce qui suit:
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if ((Keys) e.KeyValue == Keys.Escape)
this.Close();
}
Mais ça ne marche pas.
Puis j'ai essayé ceci:
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.KeyCode == Keys.Escape)
this.Close();
}
Et toujours rien ne fonctionne.
La KeyPreview de mes propriétés de formulaire Windows Forms est définie sur true ... Qu'est-ce que je fais mal?
Cela fonctionnera toujours, quelles que soient l'affectation du gestionnaire d'événements, KeyPreview, CancelButton, etc.:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == Keys.Escape) {
this.Close();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
Vous devriez simplement pouvoir définir la propriété CancelButton
du formulaire sur votre bouton Annuler. Vous n'aurez alors besoin d'aucun code.
En supposant que vous ayez un bouton "Annuler", la définition de la propriété CancelButton
du formulaire (dans le concepteur ou dans le code) devrait résoudre ce problème automatiquement. Il suffit de placer le code à fermer dans l'événement Click
du bouton.
La réponse acceptée est en effet correcte et j’ai utilisé cette approche à plusieurs reprises. Tout à coup, cela ne fonctionnerait plus, alors j'ai trouvé cela étrange. Principalement parce que mon point d'arrêt ne serait pas touché pour ESC clé, mais cela irait pour d'autres clés.
Après le débogage, j'ai découvert que l'un des contrôles de mon formulaire remplaçait la méthode ProcessCmdKey
, avec le code suivant:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// ...
if (keyData == (Keys.Escape))
{
Close();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
... et cela empêchait ma forme d'obtenir le ESC key (notez le return true
). Assurez-vous donc qu'aucun contrôle enfant ne prend en charge votre entrée.
Vous définissez KeyPreview sur true dans vos options de formulaire, puis vous y ajoutez l'événement Keypress. Dans votre événement de frappe, vous tapez ce qui suit:
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 27)
{
Close();
}
}
key.Char == 27
est la valeur d'échappement en code ASCII.
Par bouton Escape, voulez-vous dire la touche Escape? À en juger par votre code, je pense que c'est ce que vous voulez. Vous pouvez également essayer Application.Exit (), mais Close devrait fonctionner. Avez-vous un fil de travail? Si un thread autre que d'arrière-plan est en cours d'exécution, l'application pourrait rester ouverte.
Vous pouvez également déclencher une autre forme.
Par exemple. déclenchez un bouton Annuler si vous modifiez la propriété Form CancelButton et définissez le bouton Annuler.
Dans le code, vous utilisez le bouton Annuler comme suit pour fermer le formulaire:
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Abort;
}
Vous devez ajouter ceci à l'événement "KeyUp".
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Escape)
{
this.Close();
}
}