Información general sobre el uso del teclado

En Windows Forms, la entrada del usuario se envía a las aplicaciones en forma de mensajes de Windows. Una serie de métodos reemplazables procesa estos mensajes en el nivel de aplicación, formulario y control. Cuando estos métodos reciben mensajes de teclado, generan eventos que se pueden controlar para obtener información sobre la entrada del teclado. En muchos casos, las aplicaciones de Windows Forms pueden procesar toda la entrada del usuario simplemente controlando estos eventos. En otros casos, una aplicación podría necesitar invalidar uno de los métodos que procesan los mensajes para interceptar un mensaje determinado antes de que la aplicación, el formulario o el control lo reciban.

Eventos de teclado

Todos los controles de Windows Forms heredan un conjunto de eventos relacionados con la entrada del mouse y el teclado. Por ejemplo, un control puede controlar el KeyPress evento para determinar el código de carácter de una tecla presionada. Para obtener más información, consulte Uso de eventos de teclado.

Métodos que procesan mensajes de entrada de usuario

Los formularios y controles tienen acceso a la IMessageFilter interfaz y a un conjunto de métodos reemplazables que procesan mensajes de Windows en distintos puntos de la cola de mensajes. Todos estos métodos tienen un Message parámetro, que encapsula los detalles de bajo nivel de los mensajes de Windows. Puede implementar o invalidar estos métodos para examinar el mensaje y, a continuación, consumirlo o pasarlo al siguiente consumidor de la cola de mensajes. En la tabla siguiente se presentan los métodos que procesan todos los mensajes de Windows Forms.

Método Notas
PreFilterMessage Este método intercepta los mensajes de Windows en cola (también conocidos como publicados) en el nivel de aplicación.
PreProcessMessage Este método intercepta los mensajes de Windows en el nivel de formulario y control antes de que se hayan procesado.
WndProc Este método procesa los mensajes de Windows en el nivel de formulario y control.
DefWndProc Este método realiza el procesamiento predeterminado de mensajes de Windows en el nivel de formulario y control. Esto proporciona la funcionalidad mínima de una ventana.
OnNotifyMessage Este método intercepta los mensajes en el nivel de formulario y control, una vez procesados. El EnableNotifyMessage bit de estilo debe establecerse para poder llamar a este método.

Los mensajes de teclado y mouse se procesan mediante un conjunto adicional de métodos reemplazables que son específicos de esos tipos de mensajes. Para obtener más información, consulte la sección Claves de preprocesamiento .

Tipos de claves

Windows Forms identifica las entradas del teclado como códigos de teclas virtuales que se representan mediante la enumeración bit a bit Keys. Con la Keys enumeración, puede combinar una serie de teclas presionadas para dar lugar a un único valor. Estos valores corresponden a los valores que acompañan al WM_KEYDOWN y WM_SYSKEYDOWN mensajes de Windows. Puede detectar la mayoría de las pulsaciones de teclas físicas manejando los eventos KeyDown o KeyUp. Las teclas de caracteres son un subconjunto de la Keys enumeración y corresponden a los valores que acompañan al WM_CHAR y WM_SYSCHAR mensajes de Windows. Si la combinación de teclas presionadas da como resultado un carácter, puede detectar el carácter controlando el KeyPress evento. Como alternativa, puede usar Keyboard, expuesto por la interfaz de programación de Visual Basic, para detectar qué teclas se presionaron y enviar teclas. Para obtener más información, vea Acceder al teclado (Visual Basic).

Orden de eventos de teclado

Como se ha indicado anteriormente, hay tres eventos relacionados con el teclado que se pueden producir en un control. En la secuencia siguiente se muestra el orden general de los eventos:

  1. El usuario inserta la clave A , la clave se preprocesa, se envía y se produce un KeyDown evento. Si la tecla genera un carácter, también se produce un evento KeyPress.
  2. El usuario mantiene pulsada la tecla A, tanto los eventos KeyDown como KeyPress se producen repetidamente a la tasa de repetición definida por el sistema operativo.
  3. El usuario libera la clave A , la clave se preprocesa, se envía y se produce un KeyUp evento.

Preprocesamiento de claves

Al igual que otros mensajes, los mensajes de teclado se procesan en el WndProc método de un formulario o control. Sin embargo, antes de procesar los mensajes de teclado, el PreProcessMessage método llama a uno o varios métodos que se pueden invalidar para controlar teclas de caracteres especiales y teclas físicas. Puede invalidar estos métodos para detectar y filtrar determinadas claves antes de que el control procese los mensajes. En la tabla siguiente se muestra la acción que se está realizando y el método relacionado que se produce, en el orden en que se produce el método.

Preprocesamiento de un evento KeyDown

Acción Método relacionado Notas
Comprobar si es una tecla de comando como un acelerador o un método abreviado de menú. ProcessCmdKey Este método procesa una clave de comando, que tiene prioridad sobre las claves normales. Si este método devuelve true, no se envía el mensaje de clave y no se produce un evento de clave. Si devuelve false, se llama a IsInputKey..
Compruebe si hay una clave especial que requiere preprocesamiento o una clave de carácter normal que debe generar un KeyDown evento y enviarse a un control. IsInputKey Si el método devuelve true, significa que el control es un carácter normal y se genera un KeyDown evento. Si false, se llama a ProcessDialogKey. Nota: Para asegurarse de que un control obtiene una tecla o combinación de teclas, puede manejar el evento PreviewKeyDown y establecer IsInputKey del PreviewKeyDownEventArgs en true para la tecla o las teclas que desee.
Busque una clave de navegación (ESC, TAB, Return o teclas de dirección). ProcessDialogKey Este método procesa una clave física que emplea la funcionalidad especial dentro del control, como cambiar el foco entre el control y su elemento primario. Si el control más inmediato no controla la tecla, se llama al ProcessDialogKey en el control principal y así sucesivamente hasta llegar al control de nivel superior de la jerarquía. Si este método devuelve true, el preprocesamiento se completa y no se genera un evento de clave. Si devuelve false, se produce un KeyDown evento.

Preprocesamiento de un evento KeyPress

Acción Método relacionado Notas
Comprobar si la tecla es un carácter normal que el control debería procesar. IsInputChar Si el carácter es un carácter normal, este método devuelve true, se genera el KeyPress evento y no se produce ningún preprocesamiento adicional. Si no, se llama a ProcessDialogChar.
Comprobar si el carácter es un mnemotécnico (como &Aceptar en un botón) ProcessDialogChar Este método, similar a ProcessDialogKey, se invoca en la jerarquía de controles. Si el control es un control contenedor, comprueba si hay teclas de método llamando a ProcessMnemonic en sí mismo y en sus controles secundarios. Si ProcessDialogChar devuelve true, no se produce un KeyPress evento.

Procesamiento de mensajes de teclado

Después de que los mensajes de teclado lleguen al WndProc método de un formulario o control, se procesan mediante un conjunto de métodos que se pueden invalidar. Cada uno de estos métodos devuelve un Boolean valor que especifica si el control ha procesado y consumido el mensaje de teclado. Si uno de los métodos devuelve true, el mensaje se considera controlado y no se pasa a la base o al elemento primario del control para su posterior procesamiento. De lo contrario, el mensaje permanece en la cola de mensajes y se podría procesar en otro método en el elemento base o primario del control. En la tabla siguiente se presentan los métodos que procesan mensajes de teclado.

Método Notas
ProcessKeyMessage Este método procesa todos los mensajes de teclado recibidos por el WndProc método del control .
ProcessKeyPreview Este método envía el mensaje del teclado al elemento primario del control. Si ProcessKeyPreview devuelve true, no se genera ningún evento de tecla; de lo contrario, se llama a ProcessKeyEventArgs.
ProcessKeyEventArgs Este método genera los eventos KeyDown, KeyPress y KeyUp, según corresponda.

Reemplazo de métodos de teclado

Hay muchos métodos disponibles para invalidar cuando se preprocesa y procesa un mensaje de teclado; sin embargo, algunos métodos son mejores opciones que otras. En la tabla siguiente se muestran las tareas que puede querer realizar y la mejor manera de invalidar los métodos de teclado. Para obtener más información sobre cómo invalidar métodos, vea Herencia (Guía de programación de C#) o Herencia (Visual Basic)

Tarea Método
Intercepte una tecla de navegación y genere un evento KeyDown. Por ejemplo, quiere que tab y Entrar se controle en un cuadro de texto. Reemplace IsInputKey. Como alternativa, puede controlar el evento PreviewKeyDown y establecer IsInputKey de la PreviewKeyDownEventArgs en true para la tecla o las teclas que quiera.
Realice entradas especiales o ejecute el control de navegación en un control. Por ejemplo, quiere que el uso de teclas de dirección en el control de lista cambie el elemento seleccionado. Invalide ProcessDialogKey
Intercepte una tecla de navegación y genere un evento KeyPress. Por ejemplo, en un control de cuadro de número desea que al presionar varias veces una tecla de flecha se acelere la progresión por los elementos. Reemplace IsInputChar.
Realice entradas especiales o ejecute el control de navegación en un evento KeyPress. Por ejemplo, en un control de lista, al mantener presionada la tecla R, se salta entre los elementos que comienzan por la letra r. Invalide ProcessDialogChar
Realice un control de tecla de acceso personalizado; por ejemplo, desea controlar las teclas de acceso en botones dibujados por el propietario contenidos en una barra de herramientas. Reemplace ProcessMnemonic.

Consulte también