Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Windows Forms puede consumir y modificar la entrada del teclado. Consumir una clave hace referencia al control de una clave dentro de un método o controlador de eventos para que otros métodos y eventos más abajo de la cola de mensajes no reciban el valor de clave. Además, modificar una clave se refiere a modificar el valor de una clave para que los métodos y controladores de eventos más adelante en la cola de mensajes reciban un valor de clave diferente. En este artículo se muestra cómo realizar estas tareas.
Consumo de una clave
En un KeyPress controlador de eventos, establezca la propiedad Handled de la clase KeyPressEventArgs en true
.
-o-
En un KeyDown controlador de eventos, establezca la propiedad Handled de la clase KeyEventArgs en true
.
Nota:
Establecer la Handled propiedad en el KeyDown controlador de eventos no impide que se generen los eventos KeyPress y KeyUp para la pulsación de tecla actual. Use la SuppressKeyPress propiedad para este propósito.
En el ejemplo siguiente se controla el evento KeyPress para consumir las teclas de caracteres A
y a
. Esas claves no se pueden escribir en el cuadro de texto:
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
Modificación de una tecla de caracteres estándar
En un KeyPress controlador de eventos, establezca la propiedad KeyChar de la clase KeyPressEventArgs al valor de la nueva tecla de carácter.
En el siguiente ejemplo, se controla el evento KeyPress para cambiar cualquier tecla de carácter A
y a
a !
.
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
Modificación de una clave que no sea de caracteres
Solo puede modificar pulsaciones de teclas no relacionadas con caracteres heredando del control y reemplazando el PreProcessMessage método. A medida que la entrada Message se envía al control, se procesa antes de que el control genere eventos. Puede interceptar estos mensajes para modificarlos o bloquearlos.
En el ejemplo de código siguiente se muestra cómo usar la Message.WParam propiedad del m
parámetro para cambiar la tecla presionada. Este código detecta una clave de F1 a F10 y convierte la clave en una clave numérica que va de 0 a 9 (donde F10 se asigna a 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
Consulte también
.NET Desktop feedback