La documentation MSDN énonce assez clairement l'ordre dans lequel les trois événements se produisent :
Les événements clés se produisent dans l'ordre suivant :
- KeyDown
- KeyPress
- KeyUp
KeyDown
est déclenché dès que l'utilisateur appuie sur une touche du clavier, alors qu'il la maintient enfoncée.
KeyPress
est relevé pour caractère (contrairement à KeyDown et KeyUp, qui sont également levées pour les touches sans caractère) pendant que la touche est enfoncée. Il s'agit d'un événement de "niveau supérieur" par rapport à KeyDown ou KeyUp, et en tant que tel, des données différentes sont disponibles dans la fenêtre de l'événement. EventArgs
.
KeyUp
est soulevé après que l'utilisateur ait relâché une touche du clavier.
En règle générale, vous devez traiter le KeyUp
dans votre application. Les actions ne doivent pas être lancées dans l'interface utilisateur avant que après l'utilisateur relâche la clé. Et comme KeyUp
est un événement de niveau inférieur à KeyPress
vous aurez toujours à portée de main de nombreuses informations sur la touche qui a été enfoncée, et cela fonctionnera même pour la gestion des touches sans caractère.
Ce qu'il faut savoir sur tous Cependant, la particularité de ces événements est qu'ils ne sont déclenchés que par le contrôle qui a le focus. Cela signifie que si un contrôle de bouton sur votre formulaire a actuellement le focus, aucun des événements clés pour votre contrôle de bouton ne sera déclenché. formulaire ne sera jamais levé. Cette situation est souvent déroutante pour les programmeurs novices en .NET. La meilleure façon de gérer ce problème est de remplacer la fonction ProcessCmdKey
méthode :
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.A))
{
MessageBox.Show("You pressed Ctrl+A!");
}
return base.ProcessCmdKey(ref msg, keyData);
}