在Windows 8中,我以前使用注册表脚本重新映射了capslock键,以进行控制。升级到Windows 10后,此方法不再起作用。怎么做?

评论

请注意,这只会将Caps Lock重新映射到另一个Ctrl键。我希望交换它们,所以我使用了此处的说明来调整上面的脚本:superuser.com/a/1202601/315584

#1 楼

您还记得重新启动吗?似乎对我来说很好,就像在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


评论


对我来说,问题是Windows 10升级重置了我的大写锁定映射。但是,再次启动后,以相同的方式再次执行此操作。

–杰克·奥康纳(Jack O'Connor)
2015年12月1日,下午2:48

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

– Mike Niebling
2016年9月6日0:00

之后如何将其映射回Caps Lock?

– Ehtesh Choudhury
16-12-1在1:36



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

– bojolais
17年4月11日在19:16

我只需要注销并再次登录,而不必重新启动(win 10)

–piec
20年7月7日在15:10

#2 楼

如果有人需要通过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);


以管理员身份运行并重新启动。

评论


对于给出类似Linux的“复制并粘贴到shell”答案有个赞!

–mikezter
17年9月8日在8:44

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

–stewSquared
18年4月24日在20:18

先生,您今天使用Windows时的悲惨体验要少一些。为此,我谢谢你。

– Binarymason
19年1月23日在19:25

显然注销并再次登录就足够了

–piec
20年7月7日在15:10

#3 楼

您可以使用SharpKeys将任何键映射到Windows 7、8或10中的任何其他键。比自己修改注册表要容易和清洁得多。

希望这会有所帮助。

评论


我可以使用此按钮通过按大写锁定来切换语言吗?

–thanos.a
19年1月5日在17:34

只是要注意,该程序只是修改您的注册表,因此它不必一直运行或执行任何操作。伟大的实用程序!

–xaxxon
1月4日18:29

#4 楼

现在,Microsoft直接提供了一种解决方案,用于将大写锁定映射到称为PowerToys的控制键。 PowerToys不涉及使用第三方工具或手动修改注册表(如果操作不正确,则有可能引起严重问题)。 PowerToys中用于处理此问题的工具默认情况下已安装,称为键盘管理器。它的功能完全符合预期-这是Caps Lock键映射到Ctrl键的图像。



评论


哇...谢谢您让我发现一个不错的gui来执行此操作,因此我可以在更改键盘时将其启用和禁用...但是最重要的是,非常感谢您让我发现电动玩具... ..

– Enrico
20-10-14在20:48

我使用注册表“ Scancode Map”键已有多年,包括在Windows 10上,但是有一天它停止在Ctrl-X上运行。在大多数情况下,大写锁定均用作Ctrl,但与X键一起使用时则不起作用。键盘管理器似乎可以正常工作,并且还可以处理Ctrl-Alt-反斜杠,这是另一个可能会使重新映射失败的组合键。

– Ed Avis
20/12/29在10:22

...但是,PowerToys重新映射无法在远程桌面上运行。您可以在本地PC上进行重新映射,但是远程桌面会话无法获得重新映射。而且在远程PC上运行相同的PowerToys也不起作用。 (似乎以某种方式,Ctrl和Caps Lock键都被发送到了远程计算机。)

– Ed Avis
20年12月31日在13:01

#5 楼

我使用以下命令为CAPS LOCK键发送CTRL,为CTRL键发送ALT,为ALT键发送CAPS LOCK。 CTRL在上帝所希望的“ A”左侧,ALT在SHIFT下,并且完全没用的CAPS LOCK键安全地藏在必须折断手腕才能击中的位置。

评论


我非常感谢您的评论。我一直想知道代码的含义。很有帮助。

– Zaphodtx
18年8月8日在22:01

很好的解释!您是否知道Windows键的kye代码?我需要重新映射CapsLock以充当Windows密钥

–安德烈·博亚诺夫(Andrei Boyanov)
20年7月2日在17:12



#6 楼

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

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

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

评论


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

– Reb.Cabin
19 Mar 30 '19 at 4:32

我不使用emacs,在登录时自动打开.ahk文件,并且发现此解决方案是迄今为止最简单,最可移植的解决方案

– 3pitt
19年8月7日在10:51

#7 楼

这是交换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


#8 楼

无限的sysinternals工具箱还提供了一个小程序,仅用于通过控制切换大写锁定-Ctrl2Cap

Ctrl2cap是内核模式设备驱动程序,它过滤系统的键盘类驱动程序以将大写锁定字符转换为控制字符。

它已有很长的历史,但是可以在Windows 10(包括64位)上运行。您只需运行一次即可安装驱动程序。

评论


对我来说,Ctrl2Cap是目前最可靠的解决方案。注册表项“ Scancode Map”在Windows 10中可以使用,但是奇怪的是,它特别不适用于Ctrl-X按键。 PowerToys键盘管理器可以运行,包括Ctrl-X,但不能在远程桌面上运行(并且在远程PC和本地PC上运行它似乎都无法成功地重新映射)。 Ctrl2Cap将重新映射所有应用程序,包括远程桌面。

– Ed Avis
20/12/31在9:09

#9 楼

如果由于某种原因您不想运行第三方工具,则可以自己用一点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;
}


#10 楼

您可以使用lswitch将语言输入重新映射到CapsLock。


使用任何键切换输入语言,用法:lswitch [keycode]。键码是可选的,默认为上下文菜单键。另一个不错的选择是CapsLock键,其键码为20。


lswitch 20


将其添加到自动加载。

评论


这可行,但是大写锁定功能丢失了。关于如何定义大写锁定功能的任何想法转移+大写锁定组合?

–thanos.a
19年1月5日在17:51