Esta documentación está archivada y no tiene mantenimiento.

Cómo: Modificar las entradas mediante teclado en un control estándar

Los formularios Windows Forms proporcionan la posibilidad de utilizar y modificar las acciones del teclado. La utilización de teclas se refiere al control de una tecla dentro de un método o controlador de eventos de modo que otros métodos y eventos más abajo en la Message Queue no reciban el valor de la tecla. La modificación de teclas se refiere a modificar el valor de una tecla de modo que los métodos y controladores de eventos más abajo en la Message Queue reciban un valor de tecla distinto. En este tema se muestra cómo lograr estas tareas.

Para utilizar una tecla

  • En un controlador de eventos KeyPress, establezca la propiedad Handled de la clase KeyPressEventArgs en true.

    O bien,

    En un controlador de eventos KeyDown, establezca la propiedad Handled de la clase KeyEventArgs en true.

    NotaNota

    Al establecer la propiedad Handled en el controlador de eventos KeyDown no evita que se generen los eventos KeyPress y KeyUp para la presión de tecla actual. Utilice la propiedad SuppressKeyPress para este propósito.

    El ejemplo siguiente es un extracto de una instrucción switch que examina la propiedad KeyChar de la clase KeyPressEventArgs recibida por un controlador de eventos KeyPress. Este código utiliza la teclas de carácter 'A' y 'a'.

Para modificar una tecla de carácter estándar

  • En un controlador de eventos KeyPress, establezca la propiedad KeyChar de la clase KeyPressEventArgs en el valor de la nueva tecla de carácter.

    El ejemplo siguiente es un extracto de una instrucción switch que modifica 'B' con 'A' y 'b' con 'a'. Recuerde que la propiedad Handled del parámetro KeyPressEventArgs se establece en false, de modo que el nuevo valor de tecla se propagará a otros métodos y eventos de la Message Queue.

Para modificar una tecla que no sea un carácter

Ejemplo

El ejemplo de código siguiente es la aplicación completa para obtener los ejemplos de código de las secciones anteriores. La aplicación utiliza un control personalizado derivado de la clase TextBox para utilizar y modificar las acciones del teclado.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace KeyboardInput
{
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
    class Form1 : Form
    {
        // The following Windows message value is defined in Winuser.h.
        private int WM_KEYDOWN = 0x100;
        CustomTextBox CustomTextBox1 = new CustomTextBox();

        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }

        public Form1()
        {
            this.AutoSize = true;
            this.Controls.Add(CustomTextBox1);
            CustomTextBox1.KeyPress +=
                new KeyPressEventHandler(CustomTextBox1_KeyPress);
        }

        // Consume and modify several character keys.
        void CustomTextBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            switch (e.KeyChar)
            {
                // Consume 'A' and 'a'.
                case (char)65:
                case (char)97:
                    MessageBox.Show("Control.KeyPress: '" +
                        e.KeyChar.ToString() + "' consumed.");
                    e.Handled = true;
                    break;

                // Detect 'B', modify it to 'A', and forward the key.
                case (char)66:
                    MessageBox.Show("Control.KeyPress: '" +
                        e.KeyChar.ToString() + "' replaced by 'A'.");
                    e.KeyChar = (char)65;
                    e.Handled = false;
                    break;

                // Detect 'b', modify it to 'a', and forward the key.
                case (char)98:
                    MessageBox.Show("Control.KeyPress: '" +
                        e.KeyChar.ToString() + "' replaced by 'a'.");
                    e.KeyChar = (char)97;
                    e.Handled = false;
                    break;
            }
        }
    }
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
    public class CustomTextBox : TextBox
    {
        // The following Windows message value is defined in Winuser.h.
        private int WM_KEYDOWN = 0x100;

        public CustomTextBox()
        {
            this.Size = new Size(100, 100);
            this.AutoSize = false;
        }

        // Detect F1 through F9 during preprocessing and modify F3.
        public override bool PreProcessMessage(ref Message m)
        {
            if (m.Msg == WM_KEYDOWN)
            {
                Keys keyCode = (Keys)m.WParam & Keys.KeyCode;

                // Detect F1 through F9.
                switch (keyCode)
                {
                    case Keys.F1:
                    case Keys.F2:
                    case Keys.F3:
                    case Keys.F4:
                    case Keys.F5:
                    case Keys.F6:
                    case Keys.F7:
                    case Keys.F8:
                    case Keys.F9:

                        MessageBox.Show("Control.PreProcessMessage: '" +
                          keyCode.ToString() + "' pressed.");

                        // Replace F3 with F1, so that ProcessKeyMessage will  
                        // receive F1 instead of F3.
                        if (keyCode == Keys.F3)
                        {
                            m.WParam = (IntPtr)Keys.F1;
                            MessageBox.Show("Control.PreProcessMessage: '" +
                                keyCode.ToString() + "' replaced by F1.");
                        }
                        break;
                }
            }

            // Send all other messages to the base method.
            return base.PreProcessMessage(ref m);
        }

        // Detect F1 through F9 during processing.
        protected override bool ProcessKeyMessage(ref Message m)
        {
            if (m.Msg == WM_KEYDOWN)
            {
                Keys keyCode = (Keys)m.WParam & Keys.KeyCode;

                // Detect F1 through F9.
                switch (keyCode)
                {
                    case Keys.F1:
                    case Keys.F2:
                    case Keys.F3:
                    case Keys.F4:
                    case Keys.F5:
                    case Keys.F6:
                    case Keys.F7:
                    case Keys.F8:
                    case Keys.F9:

                        MessageBox.Show("Control.ProcessKeyMessage: '" +
                          keyCode.ToString() + "' pressed.");
                        break;
                }
            }

            // Send all messages to the base method.
            return base.ProcessKeyMessage(ref m);
        }
    }
}

Compilar el código

  • Este ejemplo de código requiere referencias a los ensamblados: System, System.Drawing y System.Windows.Forms.

Vea también

Mostrar: