Mapa de bloqueo de mayúsculas para controlar en Windows 10

82

En Windows 8 solía reasignar mi clave de bloqueo de mayúsculas para controlar usando el script de registro

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00

Después de haber actualizado a la ventana 10, esto ya no funciona. ¿Cómo puede hacerse esto?

Chiel ten Brinke
fuente
Tenga en cuenta que esto solo reasigna Bloq Mayús a otra tecla Ctrl. Quiero que intercambian, por lo que utiliza las instrucciones aquí para modificar la secuencia de comandos: superuser.com/a/1202601/315584
jia103

Respuestas:

87

¿Te acordaste de reiniciar? Parece funcionar bien para mí, como en 7 y 8.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00
hugh
fuente
9
El problema para mí fue que la actualización de Windows 10 restableció mi asignación de bloqueo de mayúsculas. Pero hacerlo de nuevo de la misma manera funcionó después de otro reinicio.
Jack O'Connor
38
Si alguien más como yo necesita la pieza final del rompecabezas: pegue lo anterior en un nuevo archivo de texto, guárdelo con la .regextensión, haga doble clic en el archivo para aplicar los cambios al registro y luego reinicie.
Mike Niebling
44
¿Cómo lo mapeas a Caps Lockdespués?
Ehtesh Choudhury
77
@EhteshChoudhury puede eliminar la entrada "Mapa de Scancode" debajo de la clave de registro, reiniciar y se restablecerá el comportamiento predeterminado.
bojolais
76

En caso de que alguien necesite hacer esto a través de PowerShell:

$hexified = "00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00".Split(',') | % { "0x$_"};

$kbLayout = 'HKLM:\System\CurrentControlSet\Control\Keyboard Layout';

New-ItemProperty -Path $kbLayout -Name "Scancode Map" -PropertyType Binary -Value ([byte[]]$hexified);

Ejecútelo como administrador y reinicie.

Frison Alexander
fuente
16
¡Obtenga un voto positivo por dar una respuesta de "copiar y pegar en shell" similar a Linux!
mikezter
3
Seriamente. Echo de menos tener * guiones initrc. Gracias.
stewSquared
66
Señor, ha hecho que usar Windows hoy sea una experiencia un poco menos miserable. Por eso, gracias.
binarymason el
18

Puede usar SharpKeys para asignar cualquier clave a cualquier otra clave en Windows 7, 8 o 10. Es mucho más fácil y limpio que modificar el registro usted mismo.

Espero que esto ayude.

moeabdol
fuente
2
¿Puedo usar esto para cambiar de idioma presionando mayúsculas?
thanos.a
13

Utilizo lo siguiente para enviar CTRL para la tecla BLOQ MAYÚS, enviar ALT para la tecla CTRL y BLOQUEO MAYÚSCULAS para la tecla ALT. CTRL está a la izquierda de "A" donde Dios lo intentó, ALT está debajo de SHIFT, y la tecla de BLOQUEO DE MAYÚSCULAS completamente inútil se guarda de forma segura donde tengo que romper mi muñeca para golpearla.

Windows Registry Editor Version 5.00

; The hex data is in five groups of four bytes:
;   00,00,00,00,\    header version (always 00000000)
;   00,00,00,00,\    header flags (always 00000000)
;   04,00,00,00,\    # of entries (3 in this case) plus a NULL terminator line.
;                    Entries are in 2-byte pairs: Key code to send & keyboard key to send it.
;                    Each entry is in LSB, MSB order.
;   1d,00,3a,00,\    Send LEFT CTRL (0x001d) code when user presses the CAPS LOCK key (0x003a) 
;   38,00,1d,00,\    Send LEFT ALT (0x0038) code when user presses the LEFT CTRL key (0x001d) 
;   3a,00,38,00,\    Send CAPS LOCK (0x3A) code when user presses the LEFT ALT key (0x0038) 
;   00,00,00,00      NULL terminator

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,\
                   00,00,00,00,\
                   04,00,00,00,\
                   1d,00,3a,00,\
                   38,00,1d,00,\
                   3a,00,38,00,\
                   00,00,00,00
mnemotronic
fuente
44
Realmente aprecio los comentarios. Siempre me pregunté qué significaban los códigos. Muy útil.
zaphodtx
3

Este es el script para intercambiar las teclas CTRL y BLOQ MAYÚS:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,1d,00,3a,00,3a,00,1d,00,00,00,00,00
ady
fuente
2

Puede usar lswitch para reasignar la entrada de idioma a CapsLock.

Usar cualquier tecla para cambiar los idiomas de entrada, uso: lswitch [keycode]. El código clave es opcional y el valor predeterminado es la tecla del menú contextual. Otro buen candidato es una clave CapsLock con un código clave de 20.

lswitch 20

Agréguelo a la carga automática.

Andrew K.
fuente
esto funciona, sin embargo, se pierde la funcionalidad de bloqueo de mayúsculas. ¿Alguna idea sobre cómo definir la funcionalidad de bloqueo de mayúsculas para la combinación Mayús + Bloqueo de mayúsculas?
thanos.a
2

Solía ​​usar AutoHotKey para hacer esto.

Tendría un enlace en el directorio de inicio para ejecutar un script ahk muy básico:

Capslock::Ctrl

El hecho es que Autohotkey no se ejecuta como Administrador, por lo que no afectará a las ventanas privilegiadas, a menos que use el programador de tareas en lugar del directorio de inicio para ejecutar el script al iniciar sesión con privilegios más altos. El segundo problema es que a veces, el script se cuelga cuando se reanuda el sueño, por lo que es posible que deba volver a cargarlo, lo que es molesto.

AutoHotKey es más adecuado para tareas más complejas, como escribir macros.

loxaxs
fuente
Probé la solución autohotkey y no la recomiendo. No funciona bien si tiene su velocidad de repetición automática alta, retraso bajo. Tampoco se combina bien con xkeymacs, lo que hace que las teclas emacs funcionen en casi todas partes en Windows.
Reb
No uso emacs, abro un archivo .ahk automáticamente al iniciar sesión y creo que esta solución es la más simple y portátil con diferencia
fanático número uno de Bjorks el
2

La inagotable caja de herramientas de sysinternals también proporciona un pequeño programa solo para cambiar el bloqueo de mayúsculas con control: ctrl2cap.exe.

Ernst
fuente
Bienvenido a Super User. Lea Cómo recomendar software y luego edite su respuesta para incluir al menos la información mínima requerida (los elementos en negrita ). Las publicaciones sin esta información pueden estar sujetas a eliminación. Gracias por contribuir
Digo reinstalar a Mónica el
1

Si, por alguna razón, no desea ejecutar herramientas de terceros, es posible hacerlo usted mismo con un poco de C. Gracias a la brillante respuesta de Susam Pal , puse el fragmento a continuación.

Es prácticamente un key-logger. Escucha las pulsaciones de teclas, las captura y construye la entrada del teclado con la asignación en mente. La siguiente aplicación de consola debe estar ejecutándose para que funcione.

Necesitará compilar esto de alguna manera. Usé msys2.org con pacman -S mingw-w64-x86_64-gccy compilé con /mingw64/bin/gcc nocaps.c -o nocaps.exe.

#include <stdio.h>
#include <windows.h>

HHOOK hook;

#define KEYCODE_CAPSLOCK 20
#define KEYCODE_LCTRL 162

LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
    KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *) lParam;
    INPUT input = {.type = INPUT_KEYBOARD };

    printf("nCode=%d\t wParam=%d\t p->vkCode=%lu \t p->scanCode=%d\t\n", nCode, wParam, p->vkCode, p->scanCode);


    if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) {
        input.ki.dwFlags = KEYEVENTF_KEYUP;
    }

    if (p->vkCode == KEYCODE_CAPSLOCK && (p->flags & LLKHF_INJECTED) == 0) {
        input.ki.wVk = KEYCODE_LCTRL;
        SendInput(1, &input, sizeof (INPUT));
        return 1;
    } else if (p->vkCode == KEYCODE_LCTRL && (p->flags & LLKHF_INJECTED) == 0) {
        input.ki.wVk = KEYCODE_CAPSLOCK;
        SendInput(1, &input, sizeof (INPUT));
        return 1;
    }

    return CallNextHookEx(hook, nCode, wParam, lParam);
}

int main(int argc, char **argv)
{
    MSG messages;

    hook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHook, NULL, 0);
    if (hook == NULL) {
        printf("Error %d\n", GetLastError());
        return 1;
    }

    printf("Mapping CAPSLOCK=>LCTRL and LCTRL=>CAPSLOCK..\n");
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return 0;
}
kristianlm
fuente