Comment modifier les événements de touches clavier (Windows Forms .NET)
Windows Forms offre la possibilité de consommer et de modifier l'entrée au clavier. L’utilisation d’une clé fait référence à la gestion d’une clé au sein d’une méthode ou d’un gestionnaire d’événements afin que d’autres méthodes et événements plus bas dans la file d’attente de messages ne reçoivent pas la valeur de la clé. Et, la modification d’une clé fait référence à la modification de la valeur d’une clé afin que les méthodes et les gestionnaires d’événements plus bas dans la file d’attente de messages reçoivent une valeur de clé différente. Cet article explique comment effectuer ces tâches.
Consommer une clé
Dans un gestionnaire d'événements KeyPress, affectez la valeur true
à la propriété Handled de la classe KeyPressEventArgs.
-ou-
Dans un gestionnaire d'événements KeyDown, affectez la valeur true
à la propriété Handled de la classe KeyEventArgs.
Remarque
La définition de la propriété Handled dans le gestionnaire d'événements KeyDown n'empêche pas les événements KeyPress et KeyUp d'être déclenchés pour la séquence de touches actuelle. Vous devez pour cela utiliser la propriété SuppressKeyPress.
L’exemple suivant gère l’événement KeyPress pour consommer les clés de caractères et a
les A
touches de caractères. Ces clés ne peuvent pas être tapées dans la zone de texte :
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 'a' || e.KeyChar == 'A')
e.Handled = true;
}
Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs)
If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
e.Handled = True
End If
End Sub
Modifier une clé de caractère standard
Dans un gestionnaire d'événements KeyPress, affectez à la propriété KeyChar de la classe KeyPressEventArgs la valeur de la nouvelle touche de caractère.
L’exemple suivant gère l’événement KeyPress pour modifier les clés de caractères et a
les A
touches de caractères en !
:
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 'a' || e.KeyChar == 'A')
{
e.KeyChar = '!';
e.Handled = false;
}
}
Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs)
If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
e.KeyChar = "!"c
e.Handled = False
End If
End Sub
Modifier une clé non caractère
Vous ne pouvez modifier que les appuis sur les touches autres que les caractères en héritent du contrôle et en substituant la PreProcessMessage méthode. À mesure que l’entrée Message est envoyée au contrôle, elle est traitée avant le déclenchement des événements. Vous pouvez intercepter ces messages pour les modifier ou les bloquer.
L’exemple de code suivant montre comment utiliser la WParam propriété du Message paramètre pour modifier la touche enfoncée. Ce code détecte une clé de F1 à F10 et convertit la clé en clé numérique comprise entre 0 et 9 (où F10 correspond à 0).
public override bool PreProcessMessage(ref Message m)
{
const int WM_KEYDOWN = 0x100;
if (m.Msg == WM_KEYDOWN)
{
Keys keyCode = (Keys)m.WParam & Keys.KeyCode;
// Detect F1 through F9.
m.WParam = keyCode switch
{
Keys.F1 => (IntPtr)Keys.D1,
Keys.F2 => (IntPtr)Keys.D2,
Keys.F3 => (IntPtr)Keys.D3,
Keys.F4 => (IntPtr)Keys.D4,
Keys.F5 => (IntPtr)Keys.D5,
Keys.F6 => (IntPtr)Keys.D6,
Keys.F7 => (IntPtr)Keys.D7,
Keys.F8 => (IntPtr)Keys.D8,
Keys.F9 => (IntPtr)Keys.D9,
Keys.F10 => (IntPtr)Keys.D0,
_ => m.WParam
};
}
// Send all other messages to the base method.
return base.PreProcessMessage(ref m);
}
Public Overrides Function PreProcessMessage(ByRef m As Message) As Boolean
Const WM_KEYDOWN = &H100
If m.Msg = WM_KEYDOWN Then
Dim keyCode As Keys = CType(m.WParam, Keys) And Keys.KeyCode
Select Case keyCode
Case Keys.F1 : m.WParam = CType(Keys.D1, IntPtr)
Case Keys.F2 : m.WParam = CType(Keys.D2, IntPtr)
Case Keys.F3 : m.WParam = CType(Keys.D3, IntPtr)
Case Keys.F4 : m.WParam = CType(Keys.D4, IntPtr)
Case Keys.F5 : m.WParam = CType(Keys.D5, IntPtr)
Case Keys.F6 : m.WParam = CType(Keys.D6, IntPtr)
Case Keys.F7 : m.WParam = CType(Keys.D7, IntPtr)
Case Keys.F8 : m.WParam = CType(Keys.D8, IntPtr)
Case Keys.F9 : m.WParam = CType(Keys.D9, IntPtr)
Case Keys.F10 : m.WParam = CType(Keys.D0, IntPtr)
End Select
End If
Return MyBase.PreProcessMessage(m)
End Function
Voir aussi
.NET Desktop feedback