Funcionamiento de las entradas mediante teclado
Los Windows Forms procesan las entradas mediante teclado provocando eventos de teclado en respuesta a los mensajes de Windows. La mayoría de las aplicaciones de Windows Forms procesan exclusivamente las entradas mediante teclado controlando los eventos de teclado. No obstante, es necesario comprender cómo funcionan los mensajes del teclado de modo que pueda implementar escenarios de entrada mediante teclado más avanzados, como interceptar teclas antes de que lleguen a un control. En este tema se describen los tipos de datos de tecla que los Windows Forms reconocen y se proporciona información general de cómo se enrutan los mensajes del teclado. Para información sobre los eventos de teclado, vea Utilizar eventos de teclado.
Tipos de teclas
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. Como alternativa, puede usar Keyboard, expuesto por la interfaz de programación de Visual Basic, para saber qué teclas se han presionado y enviar las teclas. Para más información, consulte Acceso al teclado.
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:
El usuario presiona la tecla "a", la tecla se preprocesa, se envía y se produce un evento KeyDown.
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.
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 true la 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. |
Invalidación 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 obtener más información sobre los métodos de invalidación, vea Invalidación de propiedades y métodos en clases derivadas.
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
.NET Desktop feedback