28 agosto 2007

Anular e intercambiar teclas en XP

Cada tecla tiene dos códigos (ScanCode), uno lo emite cuando se pulsa (representado en rojo) y el otro cuando se deja de pulsar (representado en azul). Por ejemplo, en hexadecimal:

El ScanCode de la tecla S es: 001F
El ScanCode de la tecla L es: 0026
El ScanCode de la tecla CTRL izq. es: 001D
El ScanCode de la tecla CTRL dcho. es: E01D
El ScanCode de la combinación ALT+SUPR es: 0098

Para poder anular o cambiar teclas debemos ir al editor del registro ([Inicio > Ejecutar > regedit] + ENTER) y buscar la clave:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\KeyBoard Layout

Luego hay que crear un nuevo valor binario (REG_BINARY) llamado Scancode Map con la siguiente estructura:

00 00 00 00 (Cabecera)
00 00 00 00 (Flags)
00 00 00 00 (nº de teclas a modificar + 1)
00 00 00 00 (Código para la primera tecla a modificar)
...
00 00
00 00
(Código para la última tecla a modificar)
00 00 00 00 (Terminación)

Así, puesto que:

(
OJO que los números van al revés con respecto al ScanCode)

El código para anular la tecla CTRL izdo. (001D) es 00 00 1D 00
El código para anular la tecla CTRL dcho. (E01D) es 00 00 1D E0
El código para anular la combinación ALT+SUPR (0098) es 00 00 98 00
El código para cambiar la tecla S (001F) por la L (0026) es 26 00 1F 00

La estructura del valor a introducir para conseguir anular y cambiar lo de arriba sería:

00 00 00 00 (Cabecera)
00 00 00 00 (Flags)
05 00 00 00 (nº de teclas a modificar + 1)
00 00 1D 00 (Anular la tecla CTRL izdo.)
00 00 1D E0 (Anular la tecla CTRL dcho.)
00 00 98 E0 (Anular la combinación ALT+SUPR)
26 00 1F 00 (Cambiar la tecla S por la L)
00 00 00 00 (Terminación)

Lo que tendríamos que introducir en el valor binario del registro sería entonces:

00 00 00 00 00 00 00 00 05 00 00 00 00 00 1D 00 00 00 1D E0 00 00 98 E0 26 00 1F 00 00 00 00 00

Tabla de ScanCodes:
http://www.glue.umd.edu/~nsw/ench250/scancode.htm

Enlace relacionado:
http://pio9.com/22teclado.htm