domingo, 9 de diciembre de 2012

Intercambiar teclas del teclado

Hace unos dias Daisy derramó un poco de agua sobre el teclado de su portatil y pese a que lo secó lo más rápido que pudo las teclas mayusculas izquierda y mayusculas derecha dejaron de funcionar aunque, por fortuna, el resto del teclado si respondia correctamente.

Cuando este tipo de cosas suceden lo mejor es tratar de secar el teclado rápidamente, incluso abrirlo y limpiarlo por dentro pero, aún así, es posible que algún circuito se haya dañado y a no ser que seamos unos manitas en electrónica la solución será pasar por caja y adquirir un nuevo teclado pero siendo un portatil tenía pinta de ser algo caro así que tocaba ingeniarselas de alguna otra forma.

Una opción válida para salir del paso es utilizar el telcado en pantalla que suele llevar el sistema operativo (Win7 en este caso) pero no me parece una opción muy interesante a largo plazo ya que es algo incomodo de utilizar así que pense que algo más práctico seria darle la funcionalidad de las mayusculas a otra tecla del teclado y recordé unas prácticas que se solian hacer en los primeros cursos de programación que consistian en modificar la interrupción del teclado a bajo nivel precisamente con esta finalidad aunque eso de volver a ponerme a programar en ensamblador no me llamaba mucho la atención así que me puse a buscar y vi que ya hay varios programas que permiten el mapeo de teclas, es decir, intercambiar teclas para este tipo de casos como por ejemplo MSKLC (Microsoft Keyboard Layout Creator) o SharpKeys.

Programa SharpKeys

Este último me gustó bastante porque es muy completo, es de código abierto y se ha desarrollado en Visual C#.NET lo cual me animó a profundizar un poco más en el tema y aprender como se realiza el mapeo de teclas en Windows.

Básicamente cada tecla del teclado tiene asignado un número (un código de 2 bytes) y cada vez que se pulsa una tecla este código se le envía al sistema operativo para que sepa que tecla se ha pulsado y actue en consecuencia así que lo único que hay que hacer es decirle a Windows que cada vez que pulse la tecla X entienda que se ha pulsado la tecla Y.

Como en el teclado de Daisy lo que no funciona son las mayusculas lo que vamos a hacer es sustituir la tecla CONTROL DERECHA (que si funciona correctamente) por el código de las mayusculas. Mirando en el código de SharpKeys podemos ver la lista de los códigos asignados a cada tecla pero a nosotros solo nos interesan las mayusculas (00 2A) y la tecla CONTROL DERECHA (E0 1D)



Así que ahora lo único que hace falta es saber donde poner estos códigos para que Windows sepa lo que tiene que hacer y nuevamente recurrimos al código de SharpKeys donde podemos ver lo siguiente.


Básicamente lo que hace es introducir un valor en el registro de Windows (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout) con los mapeos que se hayan definido en SharpKeys aunque nosotros solo vamos a usar uno.

Según se entiende en el código de SharpKeys, se define un array de bytes con una estructura fija 8 bytes a cero luego otros 4 bytes que representan el número de mapeos a realizar, luego 4 bytes que representan el mapeo propiamente dicho y despues otros 4 bytes a cero. Como curiosidad hay que indicar que el mapeo los códigos se deben poner invertidos, es decir, si nuestra tecla es 00 2A en la estructura se debe escribir 2A 00 quedando algo así:


Con todo lo que ya sabemos no es difícil crear un archivo para incluir esa información en el registro de Windows y hacer efectivo el mapeo que hemos definido. Solo debemos guardarlo con extensión .reg, hacer doble click sobre él y confirmar que deseamos realizar las modificaciones en el registro. Para que los cambios surtan efecto se debe reiniciar el sistema (o volver a abrir la sesión)


Por si queréis realizar otros mapeos diferentes os dejo la lista completa de códigos que aparecen en SharpKeys.



Quisiera agradecer desde aquí a Randy Rants por el buen trabajo que ha hecho con SharpKeys y por compartir el código para que todos podamos aprender y, aunque os invito a utilizar su aplicación, yo prefiero hacer las cosas a mano.

4 comentarios:

  1. Puf! qué tiempos aquellos en mis estudios universitarios cuando dábamos las interrupciones de teclado :) Cómo siempre, muy sagaz Fossie!

    ResponderEliminar
    Respuestas
    1. Ya ves, lo de las interrupciones de teclado es todo un clásico pero me dio pereza ponerme otra vez con el ASM ;D es mas fácil trastear el registro de Windows.

      Eliminar
  2. como se llama la tecla ¨fn¨

    ResponderEliminar
    Respuestas
    1. Buenos días, en la lista de mapeos de SharpKeys veo una tecla que pone

      E0 63 Special: Wake (or Fn)

      así que imagino que será esa.

      Eliminar