Mapear capslock para controlar no windows 10

82

No Windows 8, eu remapeava minha chave capslock para controlar usando o script do 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

Depois de atualizar para a janela 10, isso não funciona mais. Como pode ser feito?

Chiel ten Brinke
fonte
Observe que isso apenas refaz o Caps Lock para outra tecla Ctrl. Eu quero que eles trocaram, então eu usei as instruções aqui para ajustar o script acima: superuser.com/a/1202601/315584
jia103

Respostas:

87

Você se lembrou de reiniciar? Parece funcionar bem para mim, assim como nos 7 e 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
fonte
9
O problema para mim foi que a atualização do Windows 10 redefiniu meu mapeamento de caps lock. Mas fazê-lo novamente da mesma maneira funcionou após outro reinício.
Jack O'Connor
38
Se alguém como eu precisar da peça final do quebra-cabeça: cole o texto acima em um novo arquivo de texto, salve-o com a .regextensão, clique duas vezes no arquivo para aplicar as alterações no registro e reinicie.
Mike Niebling
4
Como você o mapeia Caps Lockdepois?
Ehtesh Choudhury 01/12/16
7
@EhteshChoudhury, você pode excluir a entrada "Mapa de scancode" sob a chave do registro, reiniciar e o comportamento padrão será restaurado.
precisa saber é o seguinte
76

Caso alguém precise fazer isso 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);

Execute-o como administrador e reinicie.

Frison Alexander
fonte
16
Tenha um voto positivo por dar uma resposta "copiar e colar no shell" do tipo Linux!
mikezter
3
A sério. Sinto falta de scripts * initrc. Obrigado.
usar o seguinte código
6
Senhor, tornou o uso do Windows hoje uma experiência um pouco menos miserável. Por isso, eu agradeço.
binarymason 23/01
18

Você pode usar as SharpKeys para mapear qualquer chave para qualquer outra chave no Windows 7, 8 ou 10. É muito mais fácil e mais limpo do que modificar você mesmo o registro.

Espero que isto ajude.

moeabdol
fonte
2
Posso usar isso para alternar idiomas pressionando caps lock?
thanos.a
13

Eu uso o seguinte para enviar CTRL para a chave CAPS LOCK, enviar ALT para a chave CTRL e enviar CAPS LOCK para a chave ALT. CTRL está à esquerda de "A", onde Deus pretendia, ALT está abaixo de SHIFT, e a tecla CAPS LOCK totalmente inútil está escondida com segurança, onde eu tenho que quebrar meu pulso para atingi-lo.

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
mnemotrônico
fonte
4
Eu realmente aprecio os comentários. Eu sempre me perguntei o que os códigos significavam. Muito útil.
Zaphodtx
3

Este é o script para trocar as teclas CTRL e 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
fonte
2

Você pode usar o lswitch para remapear a entrada de idioma para o CapsLock.

Use qualquer tecla para alternar os idiomas de entrada, uso: lswitch [keycode]. O código da chave é opcional e o padrão é a tecla do menu de contexto. Outro bom candidato é uma chave CapsLock com um código de chave 20.

lswitch 20

Adicione-o ao carregamento automático.

Andrew K.
fonte
isso funciona, no entanto, a funcionalidade caps lock é perdida. Alguma idéia de como definir a funcionalidade caps lock para alternar + combinação de caps lock?
thanos.a
2

Eu costumava usar o AutoHotKey para fazer isso.

Eu teria um link no diretório de inicialização para executar um script ahk muito básico:

Capslock::Ctrl

O problema é que a Autohotkey não é executada como Administrador, portanto não afeta as janelas privilegiadas, a menos que você use o agendador de tarefas em vez do diretório de inicialização para executar o script no logon com privilégios mais altos. O segundo problema é que, às vezes, o script trava ao retomar a suspensão, portanto, você pode precisar recarregá-lo, o que é irritante.

O AutoHotKey é mais adequado para tarefas mais complexas, como escrever macros.

loxaxs
fonte
Eu tentei a solução autohotkey e não a recomendo. Não funciona bem se você tiver sua velocidade de repetição automática alta, atraso baixo. Também não combina bem com o xkeymacs, o que faz com que as chaves do emacs funcionem em quase todos os lugares do Windows.
Reb.Cabin 30/03
Eu não uso o emacs, abro um arquivo .ahk automaticamente no login e considero esta solução a mais simples e portátil de longe
Bjorks number one fan
2

A inesgotável caixa de ferramentas sysinternals também fornece um pequeno programa apenas para alternar o capslock com control - ctrl2cap.exe.

Ernst
fonte
Bem-vindo ao superusuário. Leia Como recomendar software e edite sua resposta para incluir pelo menos as informações mínimas necessárias (os itens em negrito ). As postagens sem essas informações podem estar sujeitas a exclusão. Obrigado por contribuir.
Eu digo Restabelecer Monica
1

Se, por algum motivo, você não quiser executar ferramentas de terceiros, é possível fazer isso sozinho com um pouco de C. Graças à brilhante resposta de Susam Pal, montei o trecho abaixo.

É praticamente um registrador de chaves. Ele escuta as teclas pressionadas, as captura e constrói a entrada do teclado com o mapeamento em mente. O aplicativo de console abaixo precisa estar em execução para funcionar.

Você precisará compilar isso de alguma forma. Eu usei o msys2.org com pacman -S mingw-w64-x86_64-gcce compilei com /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
fonte