Archivo por meses: septiembre 2013

Detectar pulsación de teclas en el formulario (y controles)

 

Pues eso… esto viene a raíz de una consulta sobre cómo detectar la pulsación de teclas en los formularios de Windows Forms, es decir, saber qué tecla se ha pulsado aunque ya se esté detectando en cajas de texto u otros controles.

En los controles no hay problemas para detectarlo, ya que solo tendremos que escribir código en los eventos de pulsación de teclas: KeyPress, KeyDown o KeyUp del control y asunto arreglado.

Pero cuando se trata de detectar esas pulsaciones a nivel de formulario, es decir, independientemente de qué control tenga el foco, también podemos usar esos tres métodos de evento en el formulario, pero antes debemos indicarle al runtime de .NET que queremos detectar esas pulsaciones de teclas.

Para ello debemos asignar un valor True a la propiedad KeyPreview del formulario.

 

Distinguir la pulsación en mayúsculas de minúsculas (o no)

Si queremos detectar la pulsación de teclas sin que nos importe si es una tecla mayúscula o minúscula lo mejor es hacerlo en cualquiera de los eventos KeyDown o KeyUp, ya que en esos eventos además de la tecla pulsada se puede saber si también se pulsa la tecla Shift (cambio de mayúsculas).

En caso de querer detectar la pulsación de letras en el evento KeyPress tendremos que hacer una doble comprobación, una para la letra en mayúscula y otra para saber si es minúscula.

 

El orden de pulsación de teclas (en controles y formulario)

Debido a que podemos usar los tres eventos comentados al principio, lo mismo te interesa saber en qué orden se procesan los eventos.

El orden es el siguiente:

  1. KeyDown
  2. KeyPress
  3. KeyUp

Lista 1. Orden en que se procesan los eventos de pulsación de teclas

 

Y si estamos comprobando en el formulario además de en los controles, el orden global será el siguiente:

  1. KeyDown del formulario
  2. KeyDown del control
  3. KeyPress del formulario
  4. KeyPress del control
  5. KeyUp del formulario
  6. KeyUp del control

Lista 2. Orden en que se procesan los eventos de pulsación de teclas cuando se comprueba también en el formulario además de en los controles

 

Es decir, el mismo orden que en la lista 1, pero empezando siempre por el formulario y después en el control.

 

Veamos un poco de código de ejemplo

Para esta prueba creamos un proyecto nuevo y al formulario le añadimos los controles mostrados en la figura 1.

pulsar teclas en formulario
Figura 1. El formulario de prueba en modo de diseño

Creamos los eventos KeyDown, KeyPress y KeyUp tanto en el formulario como en las cajas de texto. Para este ejemplo, solo he puesto código para detectar la pulsación en la primera caja de textos (textBox1) y en el formulario (recuerda asignar un valor verdadero a la propiedad KeyPreview del formulario).

En este código (tanto para Visual Basic como para C#) detectamos la pulsación de las teclas S y W tanto en el textBox1 con en el propio formulario. Están contemplados los tres eventos comentados y en la caja de textos (textBox3) de la parte inferior, a la que he asignado un valor True a la propiedad MultiLine, así como el valor Vertical a la propiedad ScrollBars. con idea de que nos permita desplazarnos por el contenido y veamos la secuencia de pulsación de teclas.

 

Nota:
Más abajo tienes un enlace al proyecto del código de ejemplo.

 

Código de ejemplo para C#

Nota:
Recuerda asignar estos métodos a los eventos correspondientes.

// El orden "global" de pulsación es:
// KeyDown en formulario
// KeyDown en control
// KeyPress en formulario
// KeyPress en control
// KeyUp en formulario
// KeyUp en control

// para que detecte las pulsaciones en el formulario 
// hay que asignar un valor True a la propiedad KeyPreview del formulario

// en KeyDown no diferencia entre mayúsculas y minúsculas
// en KeyPess si distingue la diferencia

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    switch (e.KeyChar)
    {
        case (char)Keys.W: // mayúsculas
        case (char)(Keys.W + 32): // minúsculas
            label3.Text += "\nTecla W en el formulario";
            textBox3.Text += "\r\nTecla W en el formulario (KeyPress)";
            break;
        case (char)Keys.S:
        case (char)(Keys.S + 32): // minúsculas
            label3.Text += "\nTecla S en el formulario";
            break;
    }

}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    // da igual mayúsculas que minúsculas
    switch (e.KeyCode)
    {
        case Keys.S:
            label3.Text = "Tecla S en el formulario (KeyDown)";
            break;
        case Keys.W:
            label3.Text = "Tecla W en el formulario (KeyDown)";
            textBox3.Text += "\r\nTecla W en el formulario (KeyDown)";
            break;
    }
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    switch (e.KeyValue)
    {
        case (char)Keys.S:
            label3.Text = "Tecla S en el formulario (KeyUp)";
            break;
        case (char)Keys.W:
            label3.Text = "Tecla W en el formulario (KeyUp)";
            textBox3.Text += "\r\nTecla W en el formulario (KeyUp)";
            break;
    }

}


// el orden de pulsación es:
//  KeyDown, KeyPress y KeyUp

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    // e.KeyValue el código numérico
    textBox3.Text += "\r\ntextBox1_KeyDown, tecla: " + e.KeyCode;
}

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    textBox3.Text += "\r\ntextBox1_KeyPress, tecla: " + e.KeyChar;
}

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    textBox3.Text += "\r\ntextBox1_KeyUp, tecla: " + e.KeyValue;
}

 

Código de ejemplo para VB:

Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
    Select Case e.KeyChar
        Case ChrW(Keys.W), ChrW(Keys.W + 32) ' mayúsculas y minúsculas
            label3.Text &= vbCrLf & "Tecla W en el formulario"
            textBox3.Text &= vbCrLf & "Tecla W en el formulario (KeyPress)"
        Case ChrW(Keys.S), ChrW(Keys.S + 32)
            label3.Text &= vbCrLf & "Tecla S en el formulario"

    End Select
End Sub

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    ' da igual mayúsculas que minúsculas
    Select Case e.KeyCode
        Case Keys.S
            label3.Text = "Tecla S en el formulario (KeyDown)"
        Case Keys.W
            label3.Text = "Tecla W en el formulario (KeyDown)"
            textBox3.Text &= vbCrLf & "Tecla W en el formulario (KeyDown)"
    End Select
End Sub

Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    Select Case e.KeyCode
        Case Keys.S
            label3.Text = "Tecla S en el formulario (KeyUp)"
        Case Keys.W
            label3.Text = "Tecla W en el formulario (KeyUp)"
            textBox3.Text &= vbCrLf & "Tecla W en el formulario (KeyUp)"
    End Select
End Sub


' el orden de pulsación es:
' KeyDown, KeyPress y KeyUp

Private Sub textBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles textBox1.KeyDown
    ' e.KeyValue el código numérico
    textBox3.Text &= vbCrLf & "textBox1_KeyDown, tecla: " & e.KeyCode
End Sub

Private Sub textBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles textBox1.KeyPress
    textBox3.Text &= vbCrLf & "textBox1_KeyPress, tecla: " & e.KeyChar
End Sub

Private Sub textBox1_KeyUp(sender As Object, e As KeyEventArgs) Handles textBox1.KeyUp
    textBox3.Text &= vbCrLf & "textBox1_KeyUp, tecla: " & e.KeyValue
End Sub

 

Y esto es todo, espero que te sea de utilidad.

Y si quieres ver más cosas de cómo detectar la tecla pulsada o cambiar el valor de esa pulsación, lee esto: Detectar la pulsación de teclas.

Nos vemos.

Guillermo

El código del ejemplo

Este es el proyecto del código mostrado.

Lo he creado con Visual Studio 2013 Preview, pero el código es completamente compatible con cualquier versión de Visual Studio .NET, aunque es posible que los proyectos solo los puedas abrir con Visual Studio 2010 o posterior (no lo he comprobado).

Lo que si es seguro es que si añades el formulario a un proyecto creado con cualquier versión de Visual Studio .NET que utilicen el .NET 2.0 o superior, si que te servirá.

Nombre fichero: Detectar_tecla_en_formulario.zip

Tamaño: 140 KB (143 434 bytes)

Fecha: 21 septiembre 2013 14:15:32

MD5: B80281EBF0C032FBF9487C5B251FD1BB

Mostrar y cerrar apps en ejecución en Windows Phone 8

 

Pues eso, que no veía la forma de mostrar las aplicaciones que se están ejecutando en Windows Phone 8 y por tanto tampoco la forma de cerrarlas o cambiar a una recientemente abierta.

En realidad esto último no es cierto, ya que anteriormente sí que he pasado de la aplicación actual a una abierta con anterioridad, sobre todo para evitar que se "reiniciara" y perdiera lo que ya había hecho. Esto se consigue pulsando la flecha de ir hacia atrás.

El querer saber cómo cerrar aplicaciones es porque ya me ha pasado dos veces que he querido iniciar la aplicación Nokia Cam Pro o Nokia Pro Cam (que es la misma) porque me he encontrado con un aviso como el de la figura 1.

wp_ss_20130913_0002_peq
Figura 1. Nokia Cam Pro necesita más memoria

Y por tanto necesitaba cerrar alguna de las abiertas para usarla.

A pesar de no saber cómo hacerlo, el que te indique que cierre alguna aplicación abierta es una "pista" de que se pueden cerrar. Así que… había que averiguar cómo.

Seguramente el "cómo hacerlo" estará explicado en el manual del Lumina 920, pero… ya sabes lo que suele ocurrir con los manuales y en mi caso, más aún si no están impresos… ¡que (algunos) no los leemos! 🙂

Así que, busqué cómo hacerlo y me encontré (entre otras cosas) con esta página:

Cerrar aplicaciones en Windows Phone 7.5 y ahí estaba la respuesta o al menos a mí me ha servido lo que decían.

 

Para ver las aplicaciones abiertas y cambiar a una de ellas

Pulsar y mantener pulsada la flecha de ir hacia atrás.

Esto mostrará las aplicaciones abiertas (ver la figura 2) y podremos cambiar entre ellas.

wp_ss_20130913_0003
Figura 2. Lista de aplicaciones abiertas

Para cambiar a una de ellas, nos desplazamos a la que queremos y pulsamos en ella.

 

Para cerrar una aplicación abierta

Simplemente vamos pulsando la flecha de ir hacia atrás hasta que lleguemos a la pantalla que hubiese antes de abrir nuestra aplicación.

Esto también nos sirve para pasar a las aplicaciones abiertas y que mantengan el estado que tenían la última vez que la abrimos (o al menos abrirla con un estado anteriormente guardado).

 

Y esto es todo.

Espero que te sirva.

 

Nos vemos.
Guillermo

IE11 y abrir las pestañas de la última sesión

 

Zeñó, zeñó… como el IE11 (del W8.1) no me muestra los mapas de Endomondo, me digo de apartarlo una temporada y volver a Chrome.

Durante todo este tiempo, he dejado marcada la opción de iniciar Internet Explorer con la última sesión (suelo tenerla así también en el Chrome).

Durante los meses que llevo usándolo (el IE) de seguido nunca ha vuelto a abrir la sesión anterior (o a lo mejor una de cada 50 veces) y tampoco me ha dejado restaurar la última sesión (desde el enlace que hay al crear una nueva pestaña).

IE reopen last sesion

Esto mismo con Chrome (o incluso con Opera) nunca me ha pasado, es decir, siempre se abre con las pestañas que tenía en la última sesión.

Pero hace un ratillo, después de cerrar el IE11 y abrir el Chrome, me acuerdo de mirar unas cosas en una página de Microsoft, y como sé que el tema de las claves y enlaces, etc (no voy a entrar en detalles) no funciona igual en Chrome, me decido a abrir el Internet Explorer y… ¡toma! ¡pa que te calles! va y abre las pestañas de la última sesión… todo por tal de llevarme la contraria… en fin…

 

Solo esto, quería comentarlo, y aunque inicialmente iba a ser solo un comentario del Facebook, pues… mejor en el blog para que lo lea el que lo quiera leer… 😉

 

Nos vemos.
Guillermo

Iniciar Windows 8 en el escritorio

 

Pues eso, pero Windows 8, no Windows 8.1 que ese trae de fábrica lo de poder iniciar en la pantalla de Inicio (valor predeterminado) o iniciar directamente en el escritorio.

Tengo que decir que este artículo lo escribo porque ayer jueves leí cómo hacerlo en este otro: Cómo iniciar Windows 8 en el escritorio por defecto, pero resulta que lo probé y no me funcionaba, además de que al menos otro colega (Alezito) también lo probó y nada de nada, por eso quité los enlaces que puse en Twitter y mi página de Facebook.

Pero hoy mi amiga Pilar (Palel) me dice que sí que funciona, solo que hay que usar la extensión SCF en lugar de SFC que es como decían en el artículo y que el autor tampoco me lo aclaró cuando pregunté si ese "truco" funcionaba sin tener ningún programa extra instalado.

Con esto quiero decir, que el mérito de este truco no es mío, es del autor del artículo publicado en rootear.com: Alejandro López.

Y ya que estamos te explico cómo hacerlo y de paso te indicaré también que otros iconos puedes usar para el fichero este que vamos a crear.

Lo primero es crear un fichero de texto, por ejemplo abriendo el Bloc de notas o cualquier otro editor de textos y añade las siguientes líneas:

 

[Shell]
Command=2
IconFile=Explorer.exe,5

[Taskbar]
Command=ToggleDesktop

 

Lo guardas con el nombre que quieras, pero con la extensión SCF.

 

Nota:

Si usas el bloc de notas, fíjate que no te guarde el fichero con un .txt al final.

Para asegurarte de que eso no ocurra, en la lista despegable para el Tipo de fichero, selecciona Todos los archivos (*.*)

 

Cuando lo guardes fíjate que te lo mostrará con el icono del botón de "inicio" de Windows XP, tal como puedes ver en la figura 1.

escritorio W8 (SCF)

Figura 1. El contenido del fichero con extensión SCF

 

Nota:

Si quieres usar otro icono, simplemente cambia el valor del número de la línea:

IconFile=Explorer.exe,5

Los valores pueden ser desde 0 hasta 24, a partir de 24 siempre usa el mismo.

 

Una vez que tienes el fichero creado, hay que copiarlo al menú de inicio (de cuando se inicia Windows).

Si quieres que sea efectivo para todos los usuarios puedes copiarlo en este directorio:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

Ten en cuenta que si navegas desde el disco C (o la unidad en la que inicies Windows), la carpeta ProgramData estará oculta, así que… te recomiendo que copies la ruta (aunque esté en inglés) y la pegues en la dirección de una carpeta del explorador de Windows, tal como puedes ver en la figura 2. Una vez pegada (seguramente tendrás que pulsar la tecla INTRO) ya te mostrará el texto en el idioma que tengas configurado.

escritorio W8 (SCF) fig 2

Figura 2. La carpeta del menú de inicio para todos los usuarios

Nota:

Este directorio es del sistema, por tanto te pedirá confirmación (de administrador) para pegarlo.

 

Si quieres que sólo se utilice para un usuario particular, puedes usar la siguiente ruta (cambia <usuario> por el nombre del usuario en el que quieres copiarlo):

C:\Users\<usuario>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

 

Sólo me queda decirte que esto es para Windows 8, pero funciona también en Windows 8.1 Preview, aunque en este último no es necesario ya que (como te dije al principio) existe una forma más fácil de hacerlo.

También comentarte que es posible que tarde unos cuantos segundos en aparecer el escritorio, es decir, no es inmediato, primero te mostrará la pantalla de Inicio y después irá al escritorio.

Aunque, como dice mi amiga Pilar (de Palel.es) casi es más rápido usando la tecla Windows (o Windows+D) o simplemente pulsar en el tile (icono) del escritorio desde la pantalla de Inicio 🙂

Pero… si eres como "somos" muchos, lo mismo te gusta más que se inicie en el escritorio jejeje

 

Espero que te sea de utilidad.

Nos vemos.

Guillermo