<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET A new try... : WindowsForms</title><link>http://msmvps.com/blogs/otelis/archive/tags/WindowsForms/default.aspx</link><description>Tags: WindowsForms</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Archivos de los Ejemplos de Eventos del Teclado en WindowsForms</title><link>http://msmvps.com/blogs/otelis/archive/2007/05/31/archivos-de-los-ejemplos-de-eventos-del-teclado-en-windowsforms.aspx</link><pubDate>Thu, 31 May 2007 07:28:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:935338</guid><dc:creator>Octavio Telis Aynés</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/otelis/rsscomments.aspx?PostID=935338</wfw:commentRss><comments>http://msmvps.com/blogs/otelis/archive/2007/05/31/archivos-de-los-ejemplos-de-eventos-del-teclado-en-windowsforms.aspx#comments</comments><description>Hola… ¿Qué tal? En el artículo que publiqué anteriormente referente al uso de los eventos del teclado hay dos ligas a los ejemplos que acompañan al artículo, son las ligas a archivos comprimidos, uno para el ejemplo en VB.NET y otro para el ejemplo en...(&lt;a href="http://msmvps.com/blogs/otelis/archive/2007/05/31/archivos-de-los-ejemplos-de-eventos-del-teclado-en-windowsforms.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=935338" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/otelis/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/otelis/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/otelis/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://msmvps.com/blogs/otelis/archive/tags/WindowsForms/default.aspx">WindowsForms</category></item><item><title>Eventos del teclado en WindowsForms</title><link>http://msmvps.com/blogs/otelis/archive/2007/04/06/eventos-del-teclado-en-windowsforms.aspx</link><pubDate>Fri, 06 Apr 2007 05:38:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:760439</guid><dc:creator>Octavio Telis Aynés</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/otelis/rsscomments.aspx?PostID=760439</wfw:commentRss><comments>http://msmvps.com/blogs/otelis/archive/2007/04/06/eventos-del-teclado-en-windowsforms.aspx#comments</comments><description>&lt;p&gt;Hace algún tiempo escribí este artículo, quisiera compartirlo para los principiantes, cada día hay uno nuevo rondando por la red.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="TitleRow"&gt;
&lt;h1 class="dtH1"&gt;Usos de los eventos del teclado&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Octavio Telis Aynés&lt;br /&gt;&lt;a href="http://www.tutordes.com/" target="_blank"&gt;Tutordes&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Junio 2004&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Resumen&lt;/b&gt;: Durante el desarrollo de aplicaciones es común 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 artículo muestra de una manera introductoria y práctica el modo de utilizar los eventos de teclado para &amp;quot;atrapar&amp;quot; la combinación de teclas deseado o identificar la tecla presionada y ejecutar una acción determinada. &lt;/p&gt;
&lt;h4 class="dtH1"&gt;Contenido&lt;/h4&gt;
&lt;p&gt;Introducción&lt;br /&gt;Uso del evento KeyDown y KeyPress para navegar entre controles&lt;br /&gt;Uso del evento KeyUp para detectar la combinación de teclas&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 class="dtH2"&gt;Introducción&lt;/h2&gt;
&lt;p&gt;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 acción realizada por el usuario. Dichos eventos son &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeypresstopic.asp" target="_blank"&gt;KeyPress&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt; y &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeyuptopic.asp" target="_blank"&gt;KeyUp&lt;/a&gt;, la diferencia entre estos son los argumentos que reciben, para el primero se recibe la información del evento en una argumento del tipo &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformskeypresseventargsclasstopic.asp" target="_blank"&gt;System.Windows.Forms.KeyPressEventArgs&lt;/a&gt;, que expone métodos y propiedades para saber si el evento ha sido manejado (&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformskeypresseventargsclasshandledtopic.asp" target="_blank"&gt;handled&lt;/a&gt;) o el caracter que devuelve la&amp;nbsp; tecla presionada (&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformskeypresseventargsclasskeychartopic.asp" target="_blank"&gt;KeyChar&lt;/a&gt;), este evento es útil cuando se desea obtener el caracter que fue presionado, por ejemplo para manejar la tecla Enter. Los otros dos eventos, &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt; y &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeypresstopic.asp" target="_blank"&gt;KeyPress&lt;/a&gt; tienen firmas idénticas, sin embargo, &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt; sucede al momento de presionar una tecla (cuando la tecla va hacia abajo) y &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeyuptopic.asp" target="_blank"&gt;KeyUp&lt;/a&gt; sucede al momento de soltar la tecla (cuando la tecla va hacia arriba), ambos reciben información del evento por medio de un argumento del tipo &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformskeyeventargsclasstopic.asp" target="_blank"&gt;System.Windows.Forms.KeyEventArgs&lt;/a&gt;, a diferencia de KeyPressEventArgs, este tipo expone más información sobre la acción del usuario, esta información está contenida en distintas propiedades, por ejemplo Alt que indica si se presionó la tecla &amp;quot;alt&amp;quot; análogamente se comportan las propiedades Control, Shift, etc. La secuencia en que se lanzan los eventos es empezando por el &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt; seguido el &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeypresstopic.asp" target="_blank"&gt;KeyPress&lt;/a&gt; y para finalizar el &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeyuptopic.asp" target="_blank"&gt;KeyUp&lt;/a&gt;, es importante hacer notar que estos eventos se lanzan cada vez que una tecla es presionada.&lt;/p&gt;
&lt;p&gt;Podemos utilizar los eventos del teclado para distintas tareas, simplemente hay que tener en cuenta en qué momento debemos evaluar la acción del usuario para tener una ejecución en el tiempo exacto y de manera transparente.&lt;/p&gt;
&lt;h2 class="dtH2"&gt;Uso de los eventos KeyDown y KeyPress para navegar entre controles&lt;/h2&gt;
&lt;p&gt;En este ejemplo se muestra el uso del evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt; y &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeypresstopic.asp" target="_blank"&gt;KeyPress&lt;/a&gt; para cambiar el foco de un control a otro usando la tecla &lt;b&gt;Enter&lt;/b&gt; en lugar de la tecla de tabulación (Tab).&lt;/p&gt;
&lt;p&gt;El código de este ejemplo está disponible en &lt;a class="" href="http://webcast.tutordes.com/ejemplo01vb.zip" target="_blank"&gt;VB.NET&lt;/a&gt; y &lt;a class="" href="http://webcast.tutordes.com/ejemplo01cs.zip" target="_blank"&gt;VC#&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Comúnmente es típico escuchar sobre la navegación entre controles de texto en aplicaciones y no es extraño encontrarse preguntas sobre el tema en los &lt;a href="http://www.microsoft.com/spanish/msdn/gruposnoticias.asp" target="_blank"&gt;newsgroups&lt;/a&gt; y foros de discusión de .net, pues bien, como un intento de documentar de manera práctica el caso, en esta sección se muestra la manera común de hacerlo, es obvio que puede ser mejorado y que de acuerdo al interés y necesidades del desarrollador también podría ser modificado para responder a necesidades más específicas.&lt;/p&gt;
&lt;p&gt;Este ejemplo utiliza TextBoxes para la demostración, no es raro que sean los que en este caso se utilicen ya que el objetivo de usar la navegación entre controles es para agilizar la captura de datos aprovechando la experiencia de un gran número de usuarios que utilizan la tecla Enter para pasar de un campo de captura a otro. Utilizaremos básicamente dos eventos de teclado, KeyDown será utilizado para pasar el enfoque del control en cuestión al siguiente control y el evento KeyPress se utilizará para eliminar el &amp;quot;beep&amp;quot; que sucede la usar la tecla Enter cuando la acción del usuario se ha manejado previamente en otro evento. También, aprovechando el camino que estamos trazando, veremos un principio básico de la reutilización de eventos para la misma familia de controles el mismo principio se aplica para la creación de componentes de procesos de interfase de usuario que en otra ocasión podremos discutir con más detalle.&lt;/p&gt;
&lt;p&gt;Pues bien, debemos crear lo que será nuestro proyecto de prueba llamado Ejemplo01, utilizaremos Visual Studio® para crear un nuevo proyecto de aplicación para Windows.&lt;/p&gt;
&lt;p class="labelproc"&gt;&lt;b&gt;Para crear el proyecto Ejemplo01&lt;/b&gt; 
&lt;ol&gt;
&lt;li&gt;En el menú &lt;b&gt;Archivo&lt;/b&gt;, seleccione &lt;b&gt;Nuevo&lt;/b&gt; y después seleccione &lt;b&gt;Proyecto&lt;/b&gt; para abrir la venta de &lt;b&gt;Nuevo Proyecto&lt;/b&gt;. 
&lt;li&gt;Seleccione la plantilla de proyecto &lt;b&gt;Aplicación para Windows&lt;/b&gt; en la lista de proyectos para Visual Basic o Visual C# y escriba &lt;b&gt;Ejemplo01&lt;/b&gt; en la caja de texto para el &lt;b&gt;Nombre&lt;/b&gt;. 
&lt;li&gt;En el menú &lt;b&gt;Archivo&lt;/b&gt;, elija &lt;b&gt;Guardar Todo&lt;/b&gt; para guardar su proyecto &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;En el formulario que se crea predeterminadamente, dibujaremos tres controles TextBox emparejados con tres controles Label, también dibujaremos un control Button para tener una manera de salir del nuestra aplicación, la configuración de las propiedades de los controles se muestra en la tabla 1:&lt;/p&gt;
&lt;p&gt;
&lt;table class="data" class="data"&gt;

&lt;tr&gt;
&lt;th class="data" align="left" class="data"&gt;Control&lt;/th&gt;
&lt;th class="data" align="left" class="data"&gt;Propiedad&lt;/th&gt;
&lt;th class="data" align="left" class="data"&gt;Valor&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;Form&lt;/td&gt;
&lt;td class="data" class="data"&gt;Name&lt;/td&gt;
&lt;td class="data" class="data"&gt;Form1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;Text&lt;/td&gt;
&lt;td class="data" class="data"&gt;&amp;quot;Ejemplo 01&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;TextBox&lt;/td&gt;
&lt;td class="data" class="data"&gt;Name&lt;/td&gt;
&lt;td class="data" class="data"&gt;txtCampo1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;TabIndex&lt;/td&gt;
&lt;td class="data" class="data"&gt;0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;Text&lt;/td&gt;
&lt;td class="data" class="data"&gt;&amp;quot;&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;TextBox&lt;/td&gt;
&lt;td class="data" class="data"&gt;Name&lt;/td&gt;
&lt;td class="data" class="data"&gt;txtCampo2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;TabIndex&lt;/td&gt;
&lt;td class="data" class="data"&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;Text&lt;/td&gt;
&lt;td class="data" class="data"&gt;&amp;quot;&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;TextBox&lt;/td&gt;
&lt;td class="data" class="data"&gt;Name&lt;/td&gt;
&lt;td class="data" class="data"&gt;txtCampo3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;TabIndex&lt;/td&gt;
&lt;td class="data" class="data"&gt;2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;Text&lt;/td&gt;
&lt;td class="data" class="data"&gt;&amp;quot;&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;Label&lt;/td&gt;
&lt;td class="data" class="data"&gt;Name&lt;/td&gt;
&lt;td class="data" class="data"&gt;Label1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;Text&lt;/td&gt;
&lt;td class="data" class="data"&gt;&amp;quot;Campo 1&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;Label&lt;/td&gt;
&lt;td class="data" class="data"&gt;Name&lt;/td&gt;
&lt;td class="data" class="data"&gt;Label2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;Text&lt;/td&gt;
&lt;td class="data" class="data"&gt;&amp;quot;Campo 2&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;Label&lt;/td&gt;
&lt;td class="data" class="data"&gt;Name&lt;/td&gt;
&lt;td class="data" class="data"&gt;Label3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;Text&lt;/td&gt;
&lt;td class="data" class="data"&gt;&amp;quot;Campo 3&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;Button&lt;/td&gt;
&lt;td class="data" class="data"&gt;Name&lt;/td&gt;
&lt;td class="data" class="data"&gt;btnSalir&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;TabIndex&lt;/td&gt;
&lt;td class="data" class="data"&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="data" class="data"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class="data" class="data"&gt;Text&lt;/td&gt;
&lt;td class="data" class="data"&gt;Salir&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Tabla 1.- Propiedades de controles &lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;img title="Ejemplo 1" alt="Ejemplo 1" src="http://www.tutordes.com/articuloeventos1.gif" border="0" /&gt;&lt;br /&gt;Figura 1.- Formulario de ejemplo &lt;/p&gt;
&lt;p&gt;Pues bien, tenemos ya el formulario que usaremos en este ejemplo. podemos entonces continuar con el código.&lt;/p&gt;
&lt;p&gt;Empecemos con lo siguiente, definamos los eventos &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeypresstopic.asp" target="_blank"&gt;KeyPress&lt;/a&gt; y &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt; en la sección de código del formulario Form1. Para evitar repetir el mismo evento en cada uno de los controles de texto,&amp;nbsp; declararemos un método que servirá de controlador de evento para los tres TextBoxes. Empecemos con el evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeypresstopic.asp" target="_blank"&gt;KeyPress&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Para crear los controladores de eventos&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Por definición el evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeypresstopic.asp" target="_blank"&gt;KeyPress&lt;/a&gt; utiliza la firma de un delegado que contienen los siguientes argumentos; &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemObjectClassTopic.asp" target="_blank"&gt;Object&lt;/a&gt; y &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformskeypresseventargsclasstopic.asp" target="_blank"&gt;System.Windows.Forms.KeyPressEventArgs&lt;/a&gt;, conociendo esto no nos será difícil crear el controlador del evento: &lt;pre class="code"&gt;// Código en C#
private void txt_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

}

&amp;#39; Código en Visual Basic
Private Sub txt_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)

End Sub 
&lt;/pre&gt;
&lt;li&gt;Continuando haremos lo mismo para el evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt;, este evento utiliza la firma de un delegado con los siguientes argumentos; &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemObjectClassTopic.asp" target="_blank"&gt;Object&lt;/a&gt; y &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformskeyeventargsclasstopic.asp" target="_blank"&gt;System.Windows.Forms.KeyEventArgs&lt;/a&gt;, ahora que sabemos la firma, construir el controlador del evento será fácil y será tan simple como en el caso anterior del constructor del evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeypresstopic.asp" target="_blank"&gt;KeyPress&lt;/a&gt;. Veamos: &lt;pre class="code"&gt;// Código en C#
private void txt_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{

}

&amp;#39; Código en Visual Basic
Private Sub txt_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

End Sub
&lt;/pre&gt;
&lt;li&gt;Hasta este momento tenemos declarados los controladores de los eventos, sin embargo, no serán lanzados al momento de realizar alguna acción 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 más 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 línea dentro de cada método controlador lo siguiente: &lt;pre class="code"&gt;// Código en C#
TextBox txt = sender as TextBox;

&amp;#39; Código en Visual Basic
Dim txt as TextBox = DirectCast (sender,TextBox)&lt;/pre&gt;Lo que se está haciendo en esta línea 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 &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnullreferenceexceptionclasstopic.asp" target="_blank"&gt;System.NullReferenceException&lt;/a&gt; o &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsysteminvalidcastexceptionclasstopic.asp" target="_blank"&gt;System.InvalidCastException&lt;/a&gt; así pues debemos tener en cuenta que serán controladores de eventos exclusivamente para TextBoxes. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Para agregar los métodos controladores a los eventos&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Teniendo en cuenta lo anterior, definamos un método para agregar los controladores de eventos a los eventos de teclado de cada TextBox. Este método tendrá que ser invocado inmediatamente después del método InitializeComponent() dentro del constructor del formulario, definamos pues nuestro método InitializeEvents():&lt;pre class="code"&gt;// Código 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);
}

&amp;#39; Código en Visual Basic
Private Sub InitializeEvents()
    &amp;#39;
    &amp;#39;txtCampo1
    &amp;#39;
    AddHandler Me.txtCampo1.KeyPress, AddressOf txt_KeyPress
    AddHandler Me.txtCampo1.KeyDown, AddressOf txt_KeyDown
    &amp;#39;
    &amp;#39;txtCampo2
    &amp;#39;
    AddHandler Me.txtCampo2.KeyPress, AddressOf txt_KeyPress
    AddHandler Me.txtCampo2.KeyDown, AddressOf txt_KeyDown
    &amp;#39;
    &amp;#39;txtCampo3
    &amp;#39;
    AddHandler Me.txtCampo3.KeyPress, AddressOf txt_KeyPress
    AddHandler Me.txtCampo3.KeyDown, AddressOf txt_KeyDown
End Sub
&lt;/pre&gt;
&lt;li&gt;Hasta este momento hemos asignado los controladores de eventos a los eventos de nuestros controles y para que esto suceda en modo de ejecución no debemos olvidarnos de invocar el método InitializeEvents() inmediatamente después del método InitializeComponent(), esto se hará en el constructor del formulario, como se muestra a continuación: &lt;pre class="code"&gt;// Código en C#
public Form1()
{
    InitializeComponent();
    InitializeEvents();
}

&amp;#39; Código en Visual Basic
Private Sub New()
    MyBase.New()
    InitializeComponent()
    InitializeEvents()
End Sub 
&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Para agregar la funcionalidad&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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 &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt; las siguientes líneas de código, este código 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 método &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclassselectnextcontroltopic.asp" target="_blank"&gt;SelectNextControl()&lt;/a&gt; del formulario: &lt;pre class="code"&gt;// Código C#
if(e.KeyCode == Keys.Enter)
{
   this.SelectNextControl(txt,true,true,false,false);
}

&amp;#39; Código en Visual Basic
If e.KeyCode = Keys.Enter Then
   Me.SelectNextControl(txt, True, True, False, False)
End If
&lt;/pre&gt;
&lt;p&gt;Pues bien, ya solo queda ejecutar el proyecto y hacer las pruebas correspondientes. Con esto concluye el ejemplo sobre la navegación entre controles, espero en lo personal que sea útil y satisfaga una de las dudas más frecuentes sobre la navegación de controles. &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p class="labelproc"&gt;&lt;b&gt;Para probar el proyecto&lt;/b&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;En el menú &lt;b&gt;Depurar&lt;/b&gt;, elija &lt;b&gt;Iniciar&lt;/b&gt;. 
&lt;p&gt;El formulario &lt;b&gt;Form1&lt;/b&gt; se abre como se muestra en la figura 1.&lt;/p&gt;
&lt;li&gt;Presione la tecla Enter. 
&lt;p&gt;Note que el foco del control &lt;b&gt;txtCampo1&lt;/b&gt; se va al siguiente control de texto según el orden que se estableció en la propiedad TabIndex de cada uno de estos.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;h2 class="dtH2"&gt;Uso del evento KeyUp para detectar la combinación de teclas&lt;/h2&gt;
&lt;p&gt;Otra funcionalidad que comúnmente se utiliza es la de detectar qué tecla o combinación de teclas fue presionada para responder con una acción a una condición dada, esto es, en ocasiones las aplicaciones requieren de mayor versatilidad y funcionalidad y para darles estas capacidades se puede incluir el uso de &amp;quot;atajos&amp;quot; para realizar alguna acción o tarea en particular. Dentro de los estándares 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 específicas para cada aplicación.&lt;/p&gt;
&lt;p&gt;Seguiremos utilizando nuestro proyecto Ejemplo01 para mostrar una de las maneras de utilizar el evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeyuptopic.asp" target="_blank"&gt;KeyUp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Para construir el evento KeyUp&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeyuptopic.asp" target="_blank"&gt;KeyUp&lt;/a&gt; es casi idéntico al evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt;, 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 &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeydowntopic.asp" target="_blank"&gt;KeyDown&lt;/a&gt;, así pues, no nos será difícil construir el controlador de nuestro evento: &lt;pre class="code"&gt;// Código en C#
private void ctrl_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{

}

&amp;#39; Código en Visual Basic
Private Sub ctrl_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

End Sub&lt;/pre&gt;
&lt;li&gt;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 cómo cambia la conversión de sender para que esto sea posible. Recordemos que los controles se crean a partir de clases heredadas de &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsControlClassTopic.asp" target="_blank"&gt;Control&lt;/a&gt;, esta clase expone la mayoría de las propiedades que se ven en los controles que utilizamos en nuestro proyecto de ejemplo, así pues, la conversión será más general. &lt;pre class="code"&gt;// Código en C#
Control ctrl = sender as Control;

&amp;#39; Código en Visual Basic
Dim ctrl as Control = DirectCast (sender,Control)
&lt;/pre&gt;
&lt;li&gt;Solo faltará agregar a nuestro método de inicialización de eventos el código necesario para agregar el controlador a los eventos correspondientes, en esta ocasión incluiremos a nuestro botón btnSalir para demostrar la manera en que trabajará el controlador del evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeyuptopic.asp" target="_blank"&gt;KeyUp&lt;/a&gt; con cualquier control: &lt;pre class="code"&gt;// Código 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);
}

&amp;#39; Código en Visual Basic
 Private Sub InitializeEvents()
    &amp;#39;
    &amp;#39;txtCampo1
    &amp;#39;
    AddHandler Me.txtCampo1.KeyPress, AddressOf txt_KeyPress
    AddHandler Me.txtCampo1.KeyDown, AddressOf txt_KeyDown
    AddHandler Me.txtCampo1.KeyUp, AddressOf ctrl_KeyUp
    &amp;#39;
    &amp;#39;txtCampo2
    &amp;#39;
    AddHandler Me.txtCampo2.KeyPress, AddressOf txt_KeyPress
    AddHandler Me.txtCampo2.KeyDown, AddressOf txt_KeyDown
    AddHandler Me.txtCampo2.KeyUp, AddressOf ctrl_KeyUp
    &amp;#39;
    &amp;#39;txtCampo3
    &amp;#39;
    AddHandler Me.txtCampo3.KeyPress, AddressOf txt_KeyPress
    AddHandler Me.txtCampo3.KeyDown, AddressOf txt_KeyDown
    AddHandler Me.txtCampo3.KeyUp, AddressOf ctrl_KeyUp
    &amp;#39;
    &amp;#39;btnSalir
    &amp;#39;
     AddHandler Me.btnSalir.KeyUp, AddressOf ctrl_KeyUp
 End Sub&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Agregar funcionalidad al evento&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solo faltará agregar alguna funcionalidad y alguna condición de combinación de teclas para mostrar como funciona el evento &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasskeyuptopic.asp" target="_blank"&gt;KeyUp&lt;/a&gt;. Para fines prácticos, capturaremos la combinación 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 &lt;b&gt;sender&lt;/b&gt; como &lt;b&gt;Control&lt;/b&gt; para realizar el cambio a una propiedad común. Encontraremos diferencias más marcadas entre C# y VB.NET al momento de evaluar los valores de las teclas presionadas, debido a las dos propiedades de &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformskeyeventargsclasstopic.asp" target="_blank"&gt;KeyEventArgs&lt;/a&gt; que utilizaremos; &lt;a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwindowsformskeyeventargsclasskeydatatopic.asp" target="_blank"&gt;KeyData&lt;/a&gt;, que almacena la suma de los valores de las teclas presionadas (estos valores corresponden a las constantes declaradas en la enumeración &lt;a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwindowsformskeysclasstopic.asp" target="_blank"&gt;System.Windows.Forms.Keys&lt;/a&gt;) y &lt;a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwindowsformskeyeventargsclasskeycodetopic.asp" target="_blank"&gt;KeyCode&lt;/a&gt; para obtener el valor de las constantes de la enumeración &lt;a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwindowsformskeysclasstopic.asp" target="_blank"&gt;Keys&lt;/a&gt;. Para el caso de C#, los valores se tomarán directo de la enumeración por ser miembros estáticos, además tendrán que convertirse a Int32 para ser evaluados, en el caso de Visual Basic es más evidente y lo podemos hacer de una manera más directa. Hay una segunda opción para validar la acción del usuario, esta es mediante la comparación lógica, esta opción es más eficiente pues evita el uso de la clase &lt;a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemConvertClassTopic.asp" target="_blank"&gt;Convert&lt;/a&gt;, en este caso sería recomendable usar esta opción en lugar de la anterior.&lt;pre class="code"&gt;&lt;b&gt;&lt;/b&gt;
// Código 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 opción en C#
if (e.Alt &amp;amp;&amp;amp; e.Control &amp;amp;&amp;amp; e.KeyCode==Keys.B)
{
    if(ctrl.BackColor.ToString() == Color.Navy.ToString())
    {
        ctrl.BackColor= new Color();
    }
    else
    {
        ctrl.BackColor = Color.Navy;
    }
}

&amp;#39; Código 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
&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p class="labelproc"&gt;&lt;b&gt;Para probar el proyecto&lt;/b&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;En el menú &lt;b&gt;Depurar&lt;/b&gt;, elija &lt;b&gt;Iniciar&lt;/b&gt;. 
&lt;p&gt;El formulario &lt;b&gt;Form1&lt;/b&gt; se abre como se muestra en la figura 1.&lt;/p&gt;
&lt;li&gt;Presione las teclas Ctrl, Alt y B al mismo tiempo. 
&lt;p&gt;Note que el control que tenga en foco en ese momento cambiará el color de fondo a azul marino.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;h2 class="dtH2"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Hemos visto en este artículo la manera de utilizar los eventos del teclado para dar solución a aquellas preguntas que tanto se hacen en los foros. Debemos tener en consideración 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, también ver que combinaciones de teclas se utilizan para cierto caracteres, por ejemplo, ctrl + alt + Q (Esp. Latam) ó ctrl + alt + 2 (España) devuelven la arroba &amp;quot;@&amp;quot;. Pues bien, teniendo en cuenta esto no creo que exista más problema, espero sea útil la información de este artículo. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=760439" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/otelis/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/otelis/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/otelis/archive/tags/WindowsForms/default.aspx">WindowsForms</category></item></channel></rss>