Comment modifier les événements de touches clavier (Windows Forms .NET)
Windows Forms permet d’utiliser et de modifier l’entrée du clavier. La consommation d'une clé renvoie à la gestion d'une clé au sein d'une méthode ou d'un gestionnaire d'événements, de sorte que d'autres méthodes et événements en aval 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, définissez la propriété Handled de la classe KeyPressEventArgs sur true
.
-ou-
Dans un gestionnaire d’événements KeyDown, définissez la propriété Handled de la classe KeyEventArgs sur true
.
Note
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. Utilisez la propriété SuppressKeyPress à cet effet.
L’exemple suivant gère l’événement KeyPress pour consommer les clés de caractères A
et a
. 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, définissez la propriété KeyChar de la classe KeyPressEventArgs sur la valeur de la nouvelle clé de caractère.
L’exemple suivant gère l’événement KeyPress de manière à convertir les touches de caractères A
et a
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 pressions sur les touches autres que les caractères en héritant du contrôle et en surchargeant la méthode PreProcessMessage. À mesure que l'entrée Message est envoyée au contrôleur, elle est traitée avant le déclenchement des événements par le contrôleur. Vous pouvez intercepter ces messages pour les modifier ou les bloquer.
L’exemple de code suivant montre comment utiliser la propriété WParam du paramètre Message 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 mappe à 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