Sei sulla pagina 1di 11

Eventos del teclado en WindowsForms

Usos de los eventos del teclado


Tambin le puede interesar: Eventos del teclado en WPF
Octavio Telis Ayns
Junio 2004
Resumen: Durante el desarrollo de aplicaciones es comn que surja la necesidad de
aplicar combinaciones de teclas o identificar alguna tecla presionada por el usuario con
el objetivo de realizar alguna tarea o para dotar de accesos directos que provean de
funcionalidad extendida a las aplicaciones. Este artculo muestra de una manera
introductoria y prctica el modo de utilizar los eventos de teclado para atrapar la
combinacin de teclas deseado o identificar la tecla presionada y ejecutar una accin
determinada.

Contenido
Introduccin
Uso del evento KeyDown y KeyPress para navegar entre controles
Uso del evento KeyUp para detectar la combinacin de teclas

Introduccin
Los controles para Windows Forms proveen de eventos para el manejo de las acciones
del usuario con el teclado, estos eventos llegan a ser un poco diferentes entre s
dependiendo de la accin realizada por el usuario. Dichos eventos
son KeyPress,KeyDown y KeyUp, la diferencia entre estos son los argumentos que
reciben, para el primero se recibe la informacin del evento en una argumento del
tipo System.Windows.Forms.KeyPressEventArgs, que expone mtodos y propiedades
para saber si el evento ha sido manejado (handled) o el caracter que devuelve la tecla
presionada (KeyChar), este evento es til cuando se desea obtener el caracter que fue
presionado, por ejemplo para manejar la tecla Enter. Los otros dos
eventos, KeyDown yKeyPress tienen firmas idnticas, sin embargo, KeyDown sucede al
momento de presionar una tecla (cuando la tecla va hacia abajo) y KeyUp sucede al
momento de soltar la tecla (cuando la tecla va hacia arriba), ambos reciben
informacin del evento por medio de un argumento del
tipo System.Windows.Forms.KeyEventArgs, a diferencia de KeyPressEventArgs, este
tipo expone ms informacin sobre la accin del usuario, esta informacin est
contenida en distintas propiedades, por ejemplo Alt que indica si se presion la tecla
alt anlogamente se comportan las propiedades Control, Shift, etc. La secuencia en
que se lanzan los eventos es empezando por el KeyDown seguido el KeyPress y para
finalizar el KeyUp, es importante hacer notar que estos eventos se lanzan cada vez que
una tecla es presionada.

Podemos utilizar los eventos del teclado para distintas tareas, simplemente hay que
tener en cuenta en qu momento debemos evaluar la accin del usuario para tener
una ejecucin en el tiempo exacto y de manera transparente.

Uso de los eventos KeyDown y KeyPress para navegar


entre controles
En este ejemplo se muestra el uso del evento KeyDown y KeyPress para cambiar el
foco de un control a otro usando la teclaEnter en lugar de la tecla de tabulacin (Tab).

El cdigo de este ejemplo est disponible en VB.NET y VC#.

Comnmente es tpico escuchar sobre la navegacin entre controles de texto en


aplicaciones y no es extrao encontrarse preguntas sobre el tema en los newsgroups y
foros de discusin de .net, pues bien, como un intento de documentar de manera
prctica el caso, en esta seccin se muestra la manera comn de hacerlo, es obvio que
puede ser mejorado y que de acuerdo al inters y necesidades del desarrollador
tambin podra ser modificado para responder a necesidades ms especficas.

Este ejemplo utiliza TextBoxes para la demostracin, no es raro que sean los que en
este caso se utilicen ya que el objetivo de usar la navegacin entre controles es para
agilizar la captura de datos aprovechando la experiencia de un gran nmero de
usuarios que utilizan la tecla Enter para pasar de un campo de captura a otro.
Utilizaremos bsicamente dos eventos de teclado, KeyDown ser utilizado para pasar el
enfoque del control en cuestin al siguiente control y el evento KeyPress se utilizar
para eliminar el beep que sucede la usar la tecla Enter cuando la accin del usuario
se ha manejado previamente en otro evento. Tambin, aprovechando el camino que
estamos trazando, veremos un principio bsico de la reutilizacin de eventos para la
misma familia de controles el mismo principio se aplica para la creacin de
componentes de procesos de interfase de usuario que en otra ocasin podremos
discutir con ms detalle.

Pues bien, debemos crear lo que ser nuestro proyecto de prueba llamado Ejemplo01,
utilizaremos Visual Studio para crear un nuevo proyecto de aplicacin para Windows.

Para crear el proyecto Ejemplo01

1.

En el men Archivo, seleccione Nuevo y despus seleccione Proyecto para


abrir la venta de Nuevo Proyecto.

2.

Seleccione la plantilla de proyecto Aplicacin para Windows en la lista de


proyectos para Visual Basic o Visual C# y escriba Ejemplo01 en la caja de texto
para el Nombre.

3.

En el men Archivo, elija Guardar Todo para guardar su proyecto

En el formulario que se crea predeterminadamente, dibujaremos tres controles TextBox


emparejados con tres controles Label, tambin dibujaremos un control Button para
tener una manera de salir del nuestra aplicacin, la configuracin de las propiedades
de los controles se muestra en la tabla 1:

C
Form
TextBox

TextBox

TextBox

Label
Label
Label
Button

Tabla 1.- Propiedades de controles


Una vez realizado esto, quedar un formulario parecido al de la figura 1. Es importante
tener en cuenta el orden de los controles establecido por la propiedad TabIndex de
cada TextBox, ya que de esta manera tendremos asegurado el orden al pasar de un
TextBox a otro.

Figura 1.- Formulario de ejemplo

Pues bien, tenemos ya el formulario que usaremos en este ejemplo. podemos entonces
continuar con el cdigo.
Empecemos con lo siguiente, definamos los eventos KeyPress y KeyDown en la seccin
de cdigo del formulario Form1. Para evitar repetir el mismo evento en cada uno de los
controles de texto, declararemos un mtodo que servir de controlador de evento para
los tres TextBoxes. Empecemos con el evento KeyPress.
Para crear los controladores de eventos

Por definicin el evento KeyPress utiliza la firma de un delegado que contienen


los siguientes argumentos; Object ySystem.Windows.Forms.KeyPressEventArgs,
conociendo esto no nos ser difcil crear el controlador del evento:
// Cdigo en C#
private void txt_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e)
{

}
Cdigo en Visual Basic
Private Sub txt_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs)
End Sub

Continuando haremos lo mismo para el evento KeyDown, este evento utiliza la


firma de un delegado con los siguientes
argumentos; Object y System.Windows.Forms.KeyEventArgs, ahora que sabemos la
firma, construir el controlador del evento ser fcil y ser tan simple como en el
caso anterior del constructor del evento KeyPress. Veamos:
// Cdigo en C#
private void txt_KeyDown(object sender,
System.Windows.Forms.KeyEventArgs e)
{

}
Cdigo en Visual Basic
Private Sub txt_KeyDown(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs)
End Sub

Hasta este momento tenemos declarados los controladores de los eventos, sin
embargo, no sern lanzados al momento de realizar alguna accin con el teclado,
esto es porque aun no se agregan los controladores de los eventos de cada TextBox
a sus respectivos eventos, esto lo veremos ms adelante, por el momento debemos
darle la funcionalidad general requerida para poder utilizarlos en todos los controles
de texto. Para esto definiremos en la primera lnea dentro de cada mtodo
controlador lo siguiente:
// Cdigo en C#

TextBox txt = sender as TextBox;

Cdigo en Visual Basic


Dim txt as TextBox = DirectCast (sender,TextBox)Lo que se est haciendo en esta lnea
es convertir el objeto sender en TextBox, esto es porque al saber que el controlador
ser para el evento de un control TextBox, el sender ser en todos los casos un
TextBox. Claro que esto ser siempre que el controlador sea agregado a los eventos de
un TextBox en caso contrario se pueden presentar excepciones del
tipo System.NullReferenceException o System.InvalidCastException as pues debemos
tener en cuenta que sern controladores de eventos exclusivamente para TextBoxes.
Para agregar los mtodos controladores a los eventos

Teniendo en cuenta lo anterior, definamos un mtodo para agregar los


controladores de eventos a los eventos de teclado de cada TextBox. Este mtodo
tendr que ser invocado inmediatamente despus del mtodo InitializeComponent()
dentro del constructor del formulario, definamos pues nuestro mtodo
InitializeEvents():

// Cdigo en C#
private void InitializeEvents()
{
//
// txtCampo1
//
this.txtCampo1.KeyPress += new
KeyPressEventHandler(txt_KeyPress);
this.txtCampo1.KeyDown += new KeyEventHandler(txt_KeyDown);
//
// txtCampo2
//
this.txtCampo2.KeyPress += new
KeyPressEventHandler(txt_KeyPress);
this.txtCampo2.KeyDown += new KeyEventHandler(txt_KeyDown);
//
// txtCampo3
//
this.txtCampo3.KeyPress += new
KeyPressEventHandler(txt_KeyPress);
this.txtCampo3.KeyDown += new KeyEventHandler(txt_KeyDown);
}

Cdigo en Visual Basic


Private Sub InitializeEvents()

txtCampo1

AddHandler Me.txtCampo1.KeyPress, AddressOf txt_KeyPress

AddHandler

txtCampo2

AddHandler
AddHandler

txtCampo3

AddHandler
AddHandler
End Sub

Me.txtCampo1.KeyDown, AddressOf txt_KeyDown

Me.txtCampo2.KeyPress, AddressOf txt_KeyPress


Me.txtCampo2.KeyDown, AddressOf txt_KeyDown

Me.txtCampo3.KeyPress, AddressOf txt_KeyPress


Me.txtCampo3.KeyDown, AddressOf txt_KeyDown

Hasta este momento hemos asignado los controladores de eventos a los


eventos de nuestros controles y para que esto suceda en modo de ejecucin no
debemos olvidarnos de invocar el mtodo InitializeEvents() inmediatamente despus
del mtodo InitializeComponent(), esto se har en el constructor del formulario,
como se muestra a continuacin:

// Cdigo en C#
public Form1()
{
InitializeComponent();
InitializeEvents();

Cdigo en Visual Basic


Private Sub New()
MyBase.New()
InitializeComponent()
InitializeEvents()
End Sub
Para agregar la funcionalidad

Bien, ahora continuemos con la funcionalidad que queremos agregarle a nuestro


formulario, ser simple y en un instante estar listo. Agregaremos al controlador del
evento KeyDown las siguientes lneas de cdigo, este cdigo nos servir para
identificar si la tecla Enter ha sido presionada por el usuario, seguido de esto
enviaremos el foco al siguiente control con el mtodo SelectNextControl() del
formulario:
// Cdigo C#
if(e.KeyCode == Keys.Enter)
{
this.SelectNextControl(txt,true,true,false,false);
}
Cdigo en Visual Basic
If e.KeyCode = Keys.Enter Then
Me.SelectNextControl(txt, True, True, False, False)

End If
Pues bien, ya solo queda ejecutar el proyecto y hacer las pruebas correspondientes.
Con esto concluye el ejemplo sobre la navegacin entre controles, espero en lo
personal que sea til y satisfaga una de las dudas ms frecuentes sobre la navegacin
de controles.

Para probar el proyecto

1.

En el men Depurar, elija Iniciar.


El formulario Form1 se abre como se muestra en la figura 1.

2.

Presione la tecla Enter.


Note que el foco del control txtCampo1 se va al siguiente control de texto segn el
orden que se estableci en la propiedad TabIndex de cada uno de estos.

Uso del evento KeyUp para detectar la combinacin de


teclas
Otra funcionalidad que comnmente se utiliza es la de detectar qu tecla o
combinacin de teclas fue presionada para responder con una accin a una condicin
dada, esto es, en ocasiones las aplicaciones requieren de mayor versatilidad y
funcionalidad y para darles estas capacidades se puede incluir el uso de atajos para
realizar alguna accin o tarea en particular. Dentro de los estndares que se manejan
en Windows se encuentran distintas combinaciones, por ejemplo, al presionar Alt + F4
se cerrar la ventana activa, de igual manera se pueden definir combinaciones
especficas para cada aplicacin.

Seguiremos utilizando nuestro proyecto Ejemplo01 para mostrar una de las maneras
de utilizar el evento KeyUp.

Para construir el evento KeyUp

El evento KeyUp es casi idntico al evento KeyDown, la diferencia radica en el


orden en que son lanzados, sabiendo esto, veremos que la firma del delegado es la
misma que usamos con el evento KeyDown, as pues, no nos ser difcil construir el
controlador de nuestro evento:
// Cdigo en C#
private void ctrl_KeyUp(object sender,
System.Windows.Forms.KeyEventArgs e)

{
}
Cdigo en Visual Basic
Private Sub ctrl_KeyUp(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs)
End Sub

Como se puede apreciar, el evento ahora tiene el prefijo ctrl en vez de txt, y es
con el objetivo de indicar que el controlador de evento podr ser utilizado por
cualquier control que soporte los eventos del teclado, ahora veremos cmo cambia
la conversin de sender para que esto sea posible. Recordemos que los controles se
crean a partir de clases heredadas deControl, esta clase expone la mayora de las
propiedades que se ven en los controles que utilizamos en nuestro proyecto de
ejemplo, as pues, la conversin ser ms general.
// Cdigo en C#
Control ctrl = sender as Control;

Cdigo en Visual Basic


Dim ctrl as Control = DirectCast (sender,Control)

Solo faltar agregar a nuestro mtodo de inicializacin de eventos el cdigo


necesario para agregar el controlador a los eventos correspondientes, en esta
ocasin incluiremos a nuestro botn btnSalir para demostrar la manera en que
trabajar el controlador del evento KeyUp con cualquier control:
// Cdigo en C#
private void InitializeEvents()
{
//
// txtCampo1
//
this.txtCampo1.KeyPress +=new
KeyPressEventHandler(txt_KeyPress);
this.txtCampo1.KeyDown +=new KeyEventHandler(txt_KeyDown);
this.txtCampo1.KeyUp +=new KeyEventHandler(ctrl_KeyUp);
//
// txtCampo2
//
this.txtCampo2.KeyPress +=new
KeyPressEventHandler(txt_KeyPress);
this.txtCampo2.KeyDown +=new KeyEventHandler(txt_KeyDown);
this.txtCampo2.KeyUp +=new KeyEventHandler(ctrl_KeyUp);
//
// txtCampo3
//
this.txtCampo3.KeyPress +=new
KeyPressEventHandler(txt_KeyPress);
this.txtCampo3.KeyDown +=new KeyEventHandler(txt_KeyDown);
this.txtCampo3.KeyUp +=new KeyEventHandler(ctrl_KeyUp);

//
// btnSalir
//
this.btnSalir.KeyUp +=new KeyEventHandler(ctrl_KeyUp);

Cdigo en Visual Basic


Private Sub InitializeEvents()

txtCampo1

AddHandler Me.txtCampo1.KeyPress, AddressOf txt_KeyPress


AddHandler Me.txtCampo1.KeyDown, AddressOf txt_KeyDown
AddHandler Me.txtCampo1.KeyUp, AddressOf ctrl_KeyUp

txtCampo2

AddHandler Me.txtCampo2.KeyPress, AddressOf txt_KeyPress


AddHandler Me.txtCampo2.KeyDown, AddressOf txt_KeyDown
AddHandler Me.txtCampo2.KeyUp, AddressOf ctrl_KeyUp

txtCampo3

AddHandler Me.txtCampo3.KeyPress, AddressOf txt_KeyPress


AddHandler Me.txtCampo3.KeyDown, AddressOf txt_KeyDown
AddHandler Me.txtCampo3.KeyUp, AddressOf ctrl_KeyUp

btnSalir

AddHandler Me.btnSalir.KeyUp, AddressOf ctrl_KeyUp


End Sub
Agregar funcionalidad al evento

Solo faltar agregar alguna funcionalidad y alguna condicin de combinacin de


teclas para mostrar como funciona el eventoKeyUp. Para fines prcticos,
capturaremos la combinacin de las teclas Ctrl+Alt+B, con lo cual cambiaremos el
color de fondo del control que tenga el foco, esto nos dar la oportunidad de ver la
manera en que se toma al sender como Controlpara realizar el cambio a una
propiedad comn. Encontraremos diferencias ms marcadas entre C# y VB.NET al
momento de evaluar los valores de las teclas presionadas, debido a las dos
propiedades de KeyEventArgs que utilizaremos; KeyData, que almacena la suma de
los valores de las teclas presionadas (estos valores corresponden a las constantes
declaradas en la enumeracin System.Windows.Forms.Keys) y KeyCode para
obtener el valor de las constantes de la enumeracin Keys. Para el caso de C#, los
valores se tomarn directo de la enumeracin por ser miembros estticos, adems
tendrn que convertirse a Int32 para ser evaluados, en el caso de Visual Basic es
ms evidente y lo podemos hacer de una manera ms directa. Hay una segunda

opcin para validar la accin del usuario, esta es mediante la comparacin lgica,
esta opcin es ms eficiente pues evita el uso de la clase Convert, en este caso sera
recomendable usar esta opcin en lugar de la anterior.

// Cdigo en C#
if (Convert.ToInt32(e.KeyData) == Convert.ToInt32(Keys.Alt) +
Convert.ToInt32(Keys.Control) + Convert.ToInt32(Keys.B) )
{
if(ctrl.BackColor.ToString() == Color.Navy.ToString())
{
ctrl.BackColor= new Color();
}
else
{
ctrl.BackColor = Color.Navy;
}
}
// Segunda opcin en C#
if (e.Alt && e.Control && e.KeyCode==Keys.B)
{
if(ctrl.BackColor.ToString() == Color.Navy.ToString())
{
ctrl.BackColor= new Color();
}
else
{
ctrl.BackColor = Color.Navy;
}
}

Cdigo en Visual Basic


If e.KeyData = e.KeyCode.Alt + e.KeyCode.Control + e.KeyCode.B Then
If ctrl.BackColor.ToString() = System.Drawing.Color.Navy.ToString() Then
ctrl.BackColor = New System.Drawing.Color
Else
ctrl.BackColor = System.Drawing.Color.Navy
End If
End If
Para probar el proyecto

1.

En el men Depurar, elija Iniciar.


El formulario Form1 se abre como se muestra en la figura 1.

2.

Presione las teclas Ctrl, Alt y B al mismo tiempo.


Note que el control que tenga en foco en ese momento cambiar el color de fondo a
azul marino.

Conclusin
Hemos visto en este artculo la manera de utilizar los eventos del teclado para dar
solucin a aquellas preguntas que tanto se hacen en los foros. Debemos tener en
consideracin distintos aspectos, uno de ellos es tener cuidado de no utilizar
combinaciones de teclas que utilice el sistema operativo como ctrl + alt + supr, alt +
tab, tambin ver que combinaciones de teclas se utilizan para cierto caracteres, por
ejemplo, ctrl + alt + Q (Esp. Latam) ctrl + alt + 2 (Espaa) devuelven la arroba @.
Pues bien, teniendo en cuenta esto no creo que exista ms problema, espero sea til la
informacin de este artculo.
Posted in C#, .NET Framework, WinForms

Potrebbero piacerti anche