映射大写锁定以在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 2015年

Answers:


86

您还记得重新启动吗?似乎对我来说很好,就像在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升级重置了我的大写锁定映射。但是,再次启动后,以相同的方式再次执行此操作。
杰克·奥康纳

38
如果像我这样的人需要解决最后一个难题:将以上内容粘贴到一个新的文本文件中,将其保存为.reg扩展名,双击该文件以将更改应用于注册表,然后重新启动。
Mike Niebling '16

4
您如何将其映射Caps Lock回事后?
Ehtesh Choudhury

7
@EhteshChoudhury,您可以删除注册表项下的“ Scancode Map”条目,重新启动,然后将恢复默认行为。
bojolais

75

如果有人需要通过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
对于提供类似于Linux的“复制并粘贴到外壳”答案,请投票!
mikezter

3
说真的 我想念* initrc脚本。谢谢。
stewSquared

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]。键码是可选的,默认为上下文菜单键。另一个不错的选择是键码为20的CapsLock键。

lswitch 20

将其添加到自动加载。


这行得通,但是大写锁定功能丢失了。关于如何定义大写锁定功能以移位+大写锁定组合的任何想法吗?
thanos.a

2

我曾经使用AutoHotKey来做到这一点。

我会在启动目录中有一个链接来运行一个非常基本的ahk脚本:

Capslock::Ctrl

问题是,Autohotkey不会以管理员身份运行,因此不会影响特权窗口,除非您使用任务计划程序而不是启动目录在登录时以更高的特权运行脚本。第二个问题是,有时,脚本在恢复睡眠时会挂起,因此您可能需要重新加载它,这很烦人。

AutoHotKey更适合于更复杂的任务,例如编写宏。


我尝试了自动热键解决方案,但我不建议这样做。如果您的自动重复速度很高,延迟很低,则效果不佳。它也不能与xkeymacs很好地混合,这使得emacs密钥几乎可以在Windows中的任何地方工作。
Reb.Cabin

我不使用emacs,在登录时自动打开一个.ahk文件,并找到该解决方案是目前为止最简单便携
Bjorks头号粉丝

2

无限的sysinternals工具箱还提供了一个小程序,仅用于通过控件cts2cap.exe切换大写锁定。


欢迎来到超级用户。请阅读“ 如何推荐软件”,然后编辑您的答案,至少包括最低要求的信息(粗体项目)。没有此信息的帖子可能会被删除。感谢您的贡献。
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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.