Verrouillage de la carte à contrôler dans Windows 10

83

Dans Windows 8, j'avais l'habitude de remapper ma clé capslock pour la contrôler à l'aide du script de registre.

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

Après la mise à niveau vers la fenêtre 10, cela ne fonctionne plus. Comment ceci peut être fait?

Chiel ten Brinke
la source
Notez que cela remappe uniquement Caps Lock en une autre touche Ctrl. Je veux les échanger, alors j'ai utilisé les instructions ici pour peaufiner le script ci-dessus: superuser.com/a/1202601/315584
jia103

Réponses:

87

Avez-vous pensé à redémarrer? Cela semble bien fonctionner pour moi, comme en 7 et 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
la source
9
Le problème pour moi était que la mise à niveau de Windows 10 réinitialisait le mappage de mes majuscules. Mais le refaire de la même manière a fonctionné après un autre redémarrage.
Jack O'Connor
38
Si quelqu'un d'autre comme moi a besoin de la dernière pièce du puzzle: collez ce qui précède dans un nouveau fichier texte, enregistrez-le avec l' .regextension, double-cliquez sur le fichier pour appliquer les modifications au registre, puis redémarrez.
Mike Niebling
4
Comment le mappez-vous par la Caps Locksuite?
Ehtesh Choudhury
7
@EhteshChoudhury vous pouvez supprimer l'entrée "Scancode Map" sous la clé de registre, redémarrer, et le comportement par défaut sera restauré.
bojolais
76

Si quelqu'un avait besoin de le faire via 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);

Exécutez-le en tant qu'administrateur et redémarrez.

Frison Alexander
la source
16
Avoir un vote positif pour donner une réponse de type "copier-coller dans le shell" de type Linux!
Mikezter
3
Sérieusement. Avoir * des scripts initrc me manque. Merci.
stewSquared
6
Monsieur, vous avez fait de l’utilisation de Windows aujourd’hui une expérience un peu moins misérable. Pour cela, je vous remercie.
binarymason le
18

SharpKeys vous permet de mapper n’importe quelle clé sur une autre clé de Windows 7, 8 ou 10. C’est beaucoup plus facile et plus propre à faire que de modifier le registre vous-même.

J'espère que cela t'aides.

Moeabdol
la source
2
Puis-je l'utiliser pour changer de langue en appuyant sur majuscule?
thanos.a
13

J'utilise ce qui suit pour envoyer CTRL pour la touche CAPS LOCK, ALT pour la touche CTRL et ENVOYER CAPS LOCK pour la touche ALT. CTRL est à gauche de "A" où Dieu l'a voulu, ALT est en dessous de SHIFT, et la touche CAPS LOCK, totalement inutile, est rangée en toute sécurité là où je dois me casser le poignet pour la frapper.

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
mnémotronique
la source
4
J'apprécie vraiment les commentaires. Je me suis toujours demandé ce que signifiaient les codes. Très utile.
Zaphodtx
3

Voici le script pour échanger les touches CTRL et CAPS LOCK:

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
la source
3

La boîte à outils sysinternals, inépuisable, fournit également un petit programme destiné uniquement à la commutation de capslock avec control - ctrl2cap.exe.

Ernst
la source
Bienvenue sur Super User. Veuillez lire Comment recommander un logiciel, puis modifiez votre réponse pour y inclure au moins les informations minimales requises (les éléments en gras ). Les messages sans cette information peuvent être supprimés. Merci pour votre contribution.
Je dis: réintégrez Monica
2

Vous pouvez utiliser lswitch pour remapper une entrée de langue vers CapsLock.

Utilisez une touche pour changer de langue d'entrée, l' utilisation: lswitch [keycode]. Le code clé est facultatif et correspond par défaut à la touche du menu contextuel. Un autre bon candidat est une clé CapsLock avec un code clé de 20.

lswitch 20

Ajoutez-le à charger automatiquement.

Andrew K.
la source
cela fonctionne, mais la fonctionnalité de verrouillage majuscule est perdue. aucune idée sur la façon de définir la fonctionnalité de verrouillage majuscule pour décaler + combinaison de verrouillage majuscule?
thanos.a
2

J'avais l'habitude d'utiliser AutoHotKey pour faire cela.

J'aurais un lien dans le répertoire de démarrage pour exécuter un script ahk très basique:

Capslock::Ctrl

Le fait est qu'Autohotkey n'est pas exécuté en tant qu'administrateur, il n'affectera donc pas les fenêtres à privilèges, sauf si vous utilisez le planificateur de tâches au lieu du répertoire de démarrage pour exécuter le script lors de la connexion avec des privilèges plus élevés. Le deuxième problème est que, parfois, le script se bloque lors de la reprise du sommeil, il peut donc être nécessaire de le recharger, ce qui est agaçant.

AutoHotKey est mieux adapté aux tâches plus complexes, telles que l'écriture de macros.

loxaxs
la source
J'ai essayé la solution autohotkey et je ne le recommande pas. Cela ne fonctionne pas bien si votre vitesse de répétition automatique est élevée et que le retard est faible. De plus, il ne se mélange pas bien avec xkeymacs, ce qui permet aux touches d’emacs de fonctionner presque partout dans Windows.
Reb.Cabin
Je n'utilise pas emacs, j'ouvre automatiquement un fichier .ahk lors de la connexion et je trouve cette solution comme de loin la plus simple et la plus portable
fan du numéro un de Bjorks
2

Si, pour une raison quelconque, vous ne souhaitez pas utiliser d'outils tiers, vous pouvez le faire vous-même avec un peu de C. Grâce à la réponse brillante de Susam Pal , j'ai mis le fragment ci-dessous ensemble.

C'est pratiquement un enregistreur de frappe. Il écoute les pressions sur les touches, les capture et construit une entrée au clavier avec le mappage en tête. L'application de la console ci-dessous doit être en cours d'exécution pour que cela fonctionne.

Vous aurez besoin de compiler cela en quelque sorte. J'ai utilisé msys2.org avec pacman -S mingw-w64-x86_64-gccet compilé avec /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
la source