Mapa Capslock do sterowania w systemie Windows 10

82

W Windows 8 zwykłem ponownie mapować mój klawisz Capslock, aby kontrolować za pomocą skryptu rejestru

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

Po uaktualnieniu do systemu Windows 10 to już nie działa. Jak można to zrobić?

Chiel ten Brinke
źródło
Pamiętaj, że to tylko powoduje ponowne mapowanie Caps Lock na inny klawisz Ctrl. Chcę, aby zostały zamienione, więc skorzystałem z instrukcji tutaj, aby poprawić powyższy skrypt: superuser.com/a/1202601/315584
jia103

Odpowiedzi:

86

Czy pamiętasz, aby ponownie uruchomić komputer? Wydaje mi się, że działa dobrze, tak jak w 7 i 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
źródło
9
Problemem było dla mnie to, że aktualizacja systemu Windows 10 zresetowała moje mapowanie Caps Lock. Ale zrobienie tego ponownie w ten sam sposób działało po kolejnym restarcie.
Jack O'Connor,
38
Jeśli ktoś taki jak ja potrzebuje ostatniego elementu układanki: wklej powyższe do nowego pliku tekstowego, zapisz go z .regrozszerzeniem, kliknij dwukrotnie plik, aby zastosować zmiany w rejestrze, a następnie uruchom ponownie.
Mike Niebling,
4
Jak Caps Lockpóźniej to odwzorować ?
Ehtesh Choudhury,
7
@EhteshChoudhury możesz usunąć wpis „Scancode Map” pod kluczem rejestru, uruchomi się ponownie, a domyślne zachowanie zostanie przywrócone.
bojolais
75

Na wypadek, gdyby ktoś potrzebował tego za pomocą 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);

Uruchom go jako Administrator i uruchom ponownie.

Frison Alexander
źródło
16
Wyraź głos za odpowiedzią typu „kopiuj i wklej do powłoki” podobną do systemu Linux!
mikezter,
3
Poważnie. Brakuje mi * skryptów initrc. Dzięki.
gulasz Kwadrat
6
Panie, sprawiłeś, że używanie systemu Windows jest dziś nieco mniej nieszczęśliwym doświadczeniem. Dziękuję ci za to.
binarymason
18

Za pomocą klawiszy SharpKeys można mapować dowolny klucz na dowolny inny klucz w systemie Windows 7, 8 lub 10. Jest to o wiele łatwiejsze i czystsze niż samodzielna modyfikacja rejestru.

Mam nadzieję że to pomoże.

moeabdol
źródło
2
Czy mogę tego użyć do przełączania języków, naciskając Caps Lock?
thanos.a
13

Używam następujących poleceń, aby wysłać CTRL dla klawisza CAPS LOCK, wysłać ALT dla klawisza CTRL i wysłać CAPS LOCK dla klawisza ALT. CTRL znajduje się na lewo od „A”, gdzie Bóg tego chciał, ALT znajduje się poniżej SHIFT, a całkowicie bezużyteczny klawisz CAPS LOCK jest bezpiecznie schowany tam, gdzie muszę złamać nadgarstek, aby go uderzyć.

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
źródło
4
Naprawdę doceniam komentarze. Zawsze zastanawiałem się, co oznaczają kody. Bardzo pomocny.
zaphodtx,
3

Oto skrypt do zamiany klawiszy CTRL i 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
źródło
2

Możesz użyć lswitch do zmiany mapowania języka na CapsLock.

Użyj dowolny klawisz do przełączania języków wprowadzania tekstu, wykorzystanie: lswitch [keycode]. Kod dostępu jest opcjonalny i domyślnie jest kluczem menu kontekstowego. Kolejnym dobrym kandydatem jest klawisz CapsLock z kodem klucza 20.

lswitch 20

Dodaj to do automatycznego ładowania.

Andrew K.
źródło
to działa, jednak funkcja Caps Lock została utracona. jakiś pomysł, jak zdefiniować funkcjonalność Caps Lock do kombinacji Shift + Caps Lock?
thanos.a
2

Użyłem do tego AutoHotKey.

Chciałbym mieć link w katalogu startowym, aby uruchomić bardzo prosty skrypt ahk:

Capslock::Ctrl

Chodzi o to, że Autohotkey nie jest uruchamiany jako Administrator, więc nie wpłynie na uprzywilejowane okna, chyba że użyjesz harmonogramu zadań zamiast katalogu startowego do uruchomienia skryptu przy logowaniu z wyższymi uprawnieniami. Drugi problem polega na tym, że czasami skrypt zawiesza się po wznowieniu snu, więc może być konieczne ponowne załadowanie go, co jest denerwujące.

AutoHotKey lepiej nadaje się do bardziej złożonych zadań, takich jak pisanie makr.

loxaxs
źródło
Wypróbowałem rozwiązanie autohotkey i nie polecam go. Nie działa dobrze, jeśli masz wysoką prędkość automatycznego powtarzania, niskie opóźnienie. Nie miesza się również dobrze z xkeymacs, co sprawia, że ​​klucze emacsa działają prawie wszędzie w systemie Windows.
Reb.Cabin
Nie używam emacsa, automatycznie otwieram plik .ahk przy logowaniu i uważam, że to rozwiązanie jest najprostsze i jak dotąd przenośne
fan Bjorks numer jeden
2

Niewyczerpany zestaw narzędzi sysinternals zawiera również mały program do przełączania Capslocka z kontrolą - ctrl2cap.exe.

Ernst
źródło
Witamy w Super User. Przeczytaj Jak polecić oprogramowanie, a następnie edytuj swoją odpowiedź, aby zawierała co najmniej minimalne wymagane informacje (elementy pogrubione ). Posty bez tych informacji mogą zostać usunięte. Dziękuję za pomoc.
Twisty Impersonator
1

Jeśli z jakiegoś powodu nie chcesz uruchamiać narzędzi innych firm, możesz to zrobić sam z odrobiną C. Dzięki doskonałej odpowiedzi Susam Pal, ułożyłem fragment kodu poniżej.

Jest to praktycznie rejestrator kluczy. Nasłuchuje naciśnięć klawiszy, przechwytuje je i konstruuje dane z klawiatury z myślą o mapowaniu. Poniższa aplikacja konsoli musi być uruchomiona, aby działała.

Musisz to jakoś skompilować. Użyłem msys2.org zi pacman -S mingw-w64-x86_64-gccskompilowałem z /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
źródło