Información general sobre el uso del teclado (Windows Forms para .NET)

En Windows Forms, las entradas de usuario se envían 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 del teclado, generan eventos que se pueden controlar para obtener información sobre la entrada del teclado. En muchos casos, las aplicaciones de Windows Forms podrán procesar todas las entradas de usuario controlando estos eventos. En otros casos, es posible que una aplicación tenga que reemplazar uno de los métodos que procesan los mensajes para interceptar un mensaje determinado antes de que lo reciba la aplicación, el formulario o el control.

Importante

La documentación de la guía de escritorio para .NET 7 y .NET 6 está en proceso de elaboración.

Eventos de teclado

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

Métodos que procesan los mensajes de entrada de usuario

Los formularios y controles tienen acceso a la interfaz de IMessageFilter y a un conjunto de métodos reemplazables que procesan los mensajes de Windows en distintos puntos de la cola de mensajes. Todos estos métodos tienen un parámetro Message, que encapsula los detalles de bajo nivel de los mensajes de Windows. Puede implementar o reemplazar estos métodos para examinar el mensaje y luego consumirlo o pasarlo al siguiente consumidor en la cola de mensajes. En la tabla siguiente se presentan los métodos que procesan todos los mensajes de Windows en 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 de control antes de que se hayan procesado.
WndProc Este método procesa los mensajes de Windows en el nivel de formulario y de control.
DefWndProc Este método realiza el procesamiento predeterminado de los mensajes de Windows en el nivel de formulario y de control. Esto proporciona la funcionalidad mínima de una ventana.
OnNotifyMessage Este método intercepta los mensajes en el nivel de formulario y de control después de que se hayan procesado. Hay que establecer el bit de estilo EnableNotifyMessage para que se llame a este método.

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

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 enumeración Keys, puede combinar una serie de teclas presionadas para producir un valor único. Estos valores corresponden a los valores que acompañan a los mensajes de Windows WM_KEYDOWN y WM_SYSKEYDOWN. Puede detectar la mayoría de las pulsaciones de teclas físicas controlando los eventos KeyDown o KeyUp. Las teclas de carácter son un subconjunto de la enumeración Keys y corresponden a los valores que acompañan a los mensajes de Windows WM_CHAR y WM_SYSCHAR. Si la combinación de teclas presionadas da como resultado un carácter, puede detectar el carácter controlando el evento KeyPress.

Orden de eventos de teclado

Como se ha indicado anteriormente, hay 3 eventos relacionados con el teclado que pueden ocurrir en un control. La secuencia siguiente muestra el orden general de los eventos:

  1. El usuario presiona la tecla "a", la tecla se preprocesa, se envía y se produce un evento KeyDown.
  2. El usuario mantiene presionada la tecla "a", la tecla se preprocesa, se envía y se produce un evento KeyPress. Este evento se produce varias veces cuando el usuario mantiene presionada una tecla.
  3. El usuario suelta la tecla "a", la tecla se preprocesa, se envía y se produce un evento KeyUp.

Preprocesamiento de teclas

Al igual que otros mensajes, los mensajes del teclado se procesan en el método WndProc de un formulario o un control. No obstante, antes de que los mensajes del teclado se procesen, el método PreProcessMessage llama a uno o varios métodos que se pueden reemplazar para controlar teclas de caracteres especiales y teclas físicas. Puede reemplazar estos métodos para detectar y filtrar determinadas teclas antes de que el control procese los mensajes. En la tabla siguiente se muestra la acción que se realiza 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 tecla de comando, que tiene prioridad sobre las teclas normales. Si este método devuelve true, no se envía el mensaje de tecla y no se produce un evento de clave. Si devuelve false, se llama a IsInputKey..
Comprobar si es una tecla especial que requiere preprocesamiento o si es una tecla de carácter normal que provocará un evento KeyDown y se enviará a un control. IsInputKey Si el método devuelve true, significa que el control es un carácter normal y se genera un evento KeyDown. Si false, se llama a ProcessDialogKey. Nota: Para garantizar que un control obtiene una tecla o combinación de teclas, puede controlar el evento PreviewKeyDown y establecer la propiedad IsInputKey de PreviewKeyDownEventArgs en truela tecla o las teclas que quiera.
Comprobar si es una tecla de navegación (ESC, TAB, Retorno o teclas de flecha). 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 inmediato no controla la tecla, se llama al ProcessDialogKey en el control primario y así sucesivamente hasta llegar al control de nivel superior de la jerarquía. Si este método devuelve true, finaliza el preprocesamiento y no se genera un evento de clave. Si devuelve false, se produce un evento KeyDown.

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 se trata de un carácter normal, este método devuelve true, se provoca el evento KeyPress y no se produce ningún preprocesamiento más. De lo contrario, se llamará a ProcessDialogChar.
Comprobar si el carácter es un código de tecla de acceso (como &Aceptar en un botón). ProcessDialogChar Con este método, similar a ProcessDialogKey, se llamará a 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 evento KeyPress.

Procesamiento de mensajes del teclado

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

Método Notas
ProcessKeyMessage Este método procesa todos los mensajes del teclado que recibe el método WndProc 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 de invalidación cuando se preprocesa y procesa un mensaje del teclado; sin embargo, algunos métodos son opciones mucho mejores que otros. En la tabla siguiente se muestran las tareas que quizá desee llevar a cabo y la mejor forma de invalidar los métodos de teclado. Para más información sobre los métodos de reemplazo, consulte 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, desea controlar las teclas TAB y Retorno en un cuadro de texto. Reemplace IsInputKey. Nota: Como alternativa, puede controlar el evento PreviewKeyDown y establecer la propiedad IsInputKey de PreviewKeyDownEventArgs en true de la tecla o las teclas que quiera.
Realice entradas especiales o ejecute el control de navegación en un control. Por ejemplo, desea que el uso de las teclas de flecha 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, si se mantiene presionada la tecla "r", se desplazará entre elementos que comienzan con 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.

Vea también