Peta capslock untuk mengontrol di windows 10

82

Di windows 8 saya digunakan untuk memetakan ulang capslock saya untuk mengontrol menggunakan skrip registri

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

Setelah ditingkatkan ke jendela 10, ini tidak berfungsi lagi. Bagaimana itu bisa dilakukan?

Chiel ten Brinke
sumber
Perhatikan ini hanya memetakan ulang Caps Lock ke tombol Ctrl lain. Saya ingin mereka bertukar, jadi saya menggunakan petunjuk di sini untuk mengubah skrip di atas: superuser.com/a/1202601/315584
jia103

Jawaban:

87

Apakah Anda ingat untuk boot ulang? Tampaknya bekerja dengan baik untuk saya, sama seperti di 7 dan 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
sumber
9
Masalahnya bagi saya adalah bahwa upgrade Windows 10 mereset pemetaan caps lock saya. Tetapi melakukannya lagi dengan cara yang sama berhasil setelah restart lagi.
Jack O'Connor
38
Jika orang lain seperti saya membutuhkan bagian terakhir dari teka-teki: rekatkan di atas ke dalam file teks baru, simpan dengan .regekstensi, klik dua kali file untuk menerapkan perubahan ke registri, kemudian reboot.
Mike Niebling
4
Bagaimana Anda memetakannya kembali Caps Locksetelah itu?
Ehtesh Choudhury
7
@EhteshChoudhury Anda dapat menghapus entri "Scancode Map" di bawah kunci registri, reboot, dan perilaku default akan dikembalikan.
bojolais
76

Jika ada yang membutuhkan ini dilakukan melalui 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);

Jalankan sebagai Administrator dan reboot.

Frison Alexander
sumber
16
Dapatkan upvote untuk memberikan jawaban "copy & paste ke shell" seperti Linux!
mikezter
3
Serius. Saya rindu memiliki skrip initrc *. Terima kasih.
stewSquared
6
Anda, Pak, menjadikan penggunaan Windows hari ini pengalaman yang sedikit kurang menyedihkan. Untuk itu, saya ucapkan terima kasih.
binarymason
18

Anda dapat menggunakan SharpKeys untuk memetakan kunci apa saja ke kunci lainnya di Windows 7, 8, atau 10. Ini jauh lebih mudah dan bersih untuk dilakukan daripada memodifikasi registri sendiri.

Semoga ini membantu.

moeabdol
sumber
2
Bisakah saya menggunakan ini untuk berganti bahasa dengan menekan caps lock?
thanos.a
13

Saya menggunakan yang berikut ini untuk mengirim CTRL untuk kunci CAPS LOCK, mengirim ALT untuk kunci CTRL, dan mengirim CAPS LOCK untuk kunci ALT. CTRL ada di sebelah kiri "A" di mana Tuhan menginginkannya, ALT berada di bawah SHIFT, dan kunci CAPS LOCK yang sama sekali tidak berguna tersimpan dengan aman di mana saya harus mematahkan pergelangan tangan saya untuk memukulnya.

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
mnemotronik
sumber
4
Saya sangat menghargai komentarnya. Saya selalu bertanya-tanya apa arti kode-kode itu. Sangat membantu.
zaphodtx
3

Ini adalah skrip untuk menukar kunci CTRL dan 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
sumber
2

Anda dapat menggunakan lswitch untuk memetakan kembali input bahasa ke CapsLock.

Gunakan tombol untuk beralih bahasa input, penggunaan: lswitch [keycode]. Kode kunci adalah opsional dan standar untuk tombol menu konteks. Kandidat lain yang baik adalah kunci CapsLock dengan kode kunci 20.

lswitch 20

Tambahkan ke pengisian otomatis.

Andrew K.
sumber
ini berfungsi, namun fungsi caps lock hilang. ada ide tentang cara mendefinisikan fungsi caps lock untuk menggeser + kombinasi caps lock?
thanos.a
2

Saya dulu menggunakan Autohotkey untuk melakukan ini.

Saya akan memiliki tautan di direktori startup untuk menjalankan skrip ahk yang sangat mendasar:

Capslock::Ctrl

Masalahnya, Autohotkey tidak dijalankan sebagai Administrator sehingga tidak akan memengaruhi jendela istimewa, kecuali jika Anda menggunakan penjadwal tugas alih-alih direktori startup untuk menjalankan skrip saat masuk dengan hak istimewa yang lebih tinggi. Masalah kedua adalah bahwa kadang-kadang, skrip hang ketika melanjutkan tidur, jadi Anda mungkin perlu memuatnya kembali, yang menjengkelkan.

AutoHotKey lebih cocok untuk tugas yang lebih kompleks, seperti menulis makro.

loxaxs
sumber
Saya mencoba solusi autohotkey dan saya tidak merekomendasikannya. Ini tidak berfungsi dengan baik jika Anda memiliki kecepatan ulang otomatis yang tinggi, tunda rendah. Itu juga tidak tercampur dengan baik dengan xkeymacs, yang membuat kunci emacs bekerja hampir di semua tempat di Windows.
Reb.Cabin
Saya tidak menggunakan emacs, membuka file .ahk secara otomatis saat login, dan menemukan solusi ini menjadi yang paling sederhana dan portabel sejauh ini
Bjorks fan nomor satu
2

Toolbox sysinternals yang tidak habis-habisnya juga menyediakan program kecil hanya untuk beralih capslock dengan kontrol - ctrl2cap.exe.

Ernst
sumber
Selamat datang di Pengguna Super. Silakan baca Cara Merekomendasikan Perangkat Lunak kemudian edit jawaban Anda untuk memasukkan setidaknya informasi minimum yang diperlukan (item dalam huruf tebal ). Posting tanpa informasi ini dapat dihapus. Terima kasih telah berkontribusi.
Saya katakan Reinstate Monica
1

Jika, karena alasan tertentu, Anda tidak ingin menjalankan alat pihak ketiga, dimungkinkan untuk melakukan ini sendiri dengan sedikit C. Berkat jawaban brilian Susam Pal , saya menempatkan cuplikan di bawah ini bersama-sama.

Ini praktis merupakan key-logger. Ini mendengarkan penekanan tombol, menangkapnya, dan membangun input keyboard dengan pemetaan dalam pikiran. Aplikasi konsol di bawah ini harus dijalankan agar dapat berfungsi.

Anda perlu mengkompilasi ini entah bagaimana. Saya menggunakan msys2.org dengan pacman -S mingw-w64-x86_64-gccdan dikompilasi dengan /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
sumber