แมปแคปล็อกเพื่อควบคุมใน windows 10


82

ใน windows 8 ฉันเคยทำการแมปคีย์ capslock ของฉันเพื่อควบคุมการใช้สคริปต์รีจิสตรี

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

หลังจากอัปเกรดเป็นหน้าต่าง 10 สิ่งนี้จะไม่ทำงานอีกต่อไป จะทำอย่างไร?


โปรดทราบว่านี่จะทำการแมป Caps Lock ใหม่กับปุ่ม Ctrl อีกอัน ฉันต้องการให้สลับสับเปลี่ยนดังนั้นฉันจึงใช้คำแนะนำที่นี่เพื่อปรับแต่งสคริปต์ด้านบน: superuser.com/a/1202601/315584
jia103

คำตอบ:


87

คุณจำบูตอีกครั้ง? ดูเหมือนว่าจะทำงานได้ดีสำหรับฉันเช่นเดียวกับใน 7 และ 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

9
ปัญหาสำหรับฉันคือการอัพเกรด Windows 10 รีเซ็ตการแมปตัวล็อคของฉัน แต่ทำอีกครั้งในลักษณะเดียวกันกับที่ทำงานหลังจากรีสตาร์ทอีกครั้ง
Jack O'Connor

38
หากบุคคลอื่นเช่นฉันต้องการชิ้นส่วนสุดท้ายของปริศนา: วางด้านบนลงในไฟล์ข้อความใหม่ให้บันทึกด้วย.regส่วนขยายดับเบิลคลิกที่ไฟล์เพื่อใช้การเปลี่ยนแปลงกับรีจิสตรีจากนั้นรีบูท
Mike Niebling

4
คุณจะทำแผนที่ย้อนCaps Lockหลังได้อย่างไร?
Ehtesh Choudhury

7
@EhteshChoudhury คุณสามารถลบรายการ "Scancode Map" ภายใต้คีย์รีจิสตรีรีบูตและพฤติกรรมเริ่มต้นจะถูกกู้คืน
bojolais

76

ในกรณีที่ทุกคนต้องการสิ่งนี้ทำได้ผ่าน 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);

เรียกใช้ในฐานะผู้ดูแลระบบและรีบูต


16
มี upvote ให้คำตอบ "คัดลอกและวางลงในเชลล์" เหมือน Linux!
mikezter

3
อย่างจริงจัง. ฉันพลาดการมีสคริปต์ * initrc ขอบคุณ
ตุ๋น

6
คุณทำให้การใช้ Windows วันนี้เป็นประสบการณ์ที่น่าสังเวชน้อยลงเล็กน้อย สำหรับสิ่งนั้นฉันขอขอบคุณ
binarymason

18

คุณสามารถใช้SharpKeysเพื่อแมปคีย์ใด ๆ กับคีย์อื่น ๆ ใน Windows 7, 8 หรือ 10 ได้ง่ายกว่าและสะอาดกว่าการแก้ไขรีจิสตรีด้วยตัวเอง

หวังว่านี่จะช่วยได้


2
ฉันสามารถใช้สิ่งนี้เพื่อสลับภาษาโดยการกดปุ่มตัวล็อคได้ไหม?
thanos.a

13

ฉันใช้สิ่งต่อไปนี้เพื่อส่ง CTRL สำหรับปุ่ม CAPS LOCK ส่ง ALT สำหรับปุ่ม CTRL และส่ง CAPS LOCK สำหรับปุ่ม ALT CTRL อยู่ทางด้านซ้ายของ "A" ที่พระเจ้าทรงตั้งใจ ALT อยู่ต่ำกว่า SHIFT และปุ่ม CAPS LOCK ที่ไร้ประโยชน์ที่สุดนั้นถูกซ่อนไว้อย่างปลอดภัยในที่ซึ่งฉันต้องหักข้อมือเพื่อตีมัน

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

4
ฉันขอขอบคุณความคิดเห็นจริงๆ ฉันสงสัยอยู่เสมอว่ารหัสมีความหมายว่าอย่างไร มีประโยชน์มาก
zaphodtx

3

นี่คือสคริปต์เพื่อสลับคีย์ CTRL และ 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

2

คุณสามารถใช้lswitchเพื่อทำการแมปภาษาที่ป้อนเข้ากับ CapsLock

ใช้ปุ่มใด ๆ lswitch [keycode]เพื่อสลับภาษาสำหรับการป้อนการใช้งาน: Keycode เป็นทางเลือกและเป็นค่าเริ่มต้นสำหรับปุ่มเมนูบริบท ตัวเลือกที่ดีอีกอย่างคือคีย์ CapsLock ที่มีรหัส 20 ตัว

lswitch 20

เพิ่มลงใน autoload


ใช้งานได้ แต่ฟังก์ชั่นการล็อคตัวพิมพ์ใหญ่หายไป แนวคิดใดเกี่ยวกับวิธีการกำหนดฟังก์ชั่นการล็อคแคปเพื่อเปลี่ยน + รวมการล็อกแคป
thanos.a

2

ฉันเคยใช้ AutoHotKey เพื่อทำสิ่งนี้

ฉันมีลิงก์ในไดเรกทอรีเริ่มต้นเพื่อเรียกใช้สคริปต์ ahk พื้นฐานมาก:

Capslock::Ctrl

สิ่งนี้คือ Autohotkey ไม่ได้ทำงานในฐานะผู้ดูแลระบบดังนั้นจะไม่ส่งผลกระทบต่อหน้าต่างที่มีสิทธิ์ยกเว้นว่าคุณใช้ตัวกำหนดตารางงานแทนไดเรกทอรีเริ่มต้นเพื่อเรียกใช้สคริปต์เมื่อเข้าสู่ระบบด้วยสิทธิ์ระดับสูงกว่า ปัญหาที่สองคือบางครั้งสคริปต์จะหยุดทำงานเมื่อกลับมาทำงานในโหมดสลีปดังนั้นคุณอาจต้องโหลดซ้ำซึ่งน่ารำคาญ

AutoHotKey เหมาะสำหรับงานที่ซับซ้อนมากขึ้นเช่นการเขียนแมโคร


ฉันลองโซลูชัน autohotkey แล้วและฉันไม่แนะนำ มันใช้งานไม่ได้ถ้าคุณมีความเร็วในการ autorepeat สูงช้าดี มันยังไม่เข้ากันกับ xkeymacs ซึ่งทำให้ปุ่ม emacs ทำงานได้เกือบทุกที่ใน Windows
Reb.Cabin

ฉันไม่ได้ใช้ emacs เปิดไฟล์. ahk โดยอัตโนมัติเมื่อเข้าสู่ระบบและหาวิธีแก้ปัญหานี้ให้เป็นวิธีที่ง่ายและพกพาได้มากที่สุด
Bjorks แฟนอันดับหนึ่ง

2

กล่องเครื่องมือ sysinternals ที่ไม่รู้จักเหนื่อยยังให้โปรแกรมเล็ก ๆ น้อย ๆ เพียงแค่เปลี่ยน capslock ด้วย control - ctrl2cap.exe


ยินดีต้อนรับสู่ Super User โปรดอ่านวิธีแนะนำซอฟต์แวร์จากนั้นแก้ไขคำตอบของคุณเพื่อรวมข้อมูลที่จำเป็นขั้นต่ำ (รายการที่เป็นตัวหนา ) อย่างน้อย โพสต์ที่ไม่มีข้อมูลนี้อาจถูกลบ ขอบคุณสำหรับการมีส่วนร่วม
ตัวปลอมตัว Twisty

1

หากด้วยเหตุผลบางอย่างคุณไม่ต้องการเรียกใช้เครื่องมือของบุคคลที่สามเป็นไปได้ที่จะทำสิ่งนี้ด้วยตัวคุณเองด้วย C. เล็กน้อยด้วยคำตอบที่ยอดเยี่ยมของ Susam Pal ฉันได้วางตัวอย่างด้านล่างไว้ด้วยกัน

มันเป็นเครื่องมือบันทึกคีย์ มันฟังการกดปุ่มจับพวกเขาและสร้างการป้อนข้อมูลแป้นพิมพ์ด้วยการทำแผนที่ในใจ แอปคอนโซลด้านล่างจะต้องทำงานเพื่อให้ทำงานได้

คุณจะต้องรวบรวมสิ่งนี้อย่างใด ผมใช้กับ msys2.org และเรียบเรียงด้วยpacman -S mingw-w64-x86_64-gcc/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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.