将大写锁定映射到 Windows 10 中的控制

Chi*_*nke 122 remapping keyboard-layout key-binding capslock windows-10

在 Windows 8 中,我曾经使用注册表脚本重新映射我的大写锁定键以进行控制

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
Run Code Online (Sandbox Code Playgroud)

升级到 Window 10 后,这不再起作用。

怎么做到呢?

小智 130

如果有人需要通过 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);
Run Code Online (Sandbox Code Playgroud)

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

  • 对给出类似 Linux 的“复制并粘贴到 shell”的回答点赞! (25认同)
  • 先生,今天使用 Windows 的体验稍微不那么痛苦了。为此,我感谢你。 (10认同)
  • 严重地。我想念 *initrc 脚本。谢谢。 (3认同)
  • 显然注销并再次登录就足够了 (3认同)

小智 103

你记得重启吗?它对我来说很好用,就像在 Windows 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
Run Code Online (Sandbox Code Playgroud)

  • 如果像我这样的其他人需要最后一块拼图:将上述内容粘贴到一个新的文本文件中,使用 `.reg` 扩展名保存它,双击该文件以将更改应用到注册表,然后重新启动。 (47认同)
  • 我的问题是 Windows 10 升级*重置*我的大写锁定映射。但是在再次重新启动后以相同的方式再次执行此操作。 (9认同)
  • @EhteshChoudhury 您可以删除注册表项下的“扫描码映射”条目,重新启动,将恢复默认行为。 (7认同)
  • 之后如何将其映射回“Caps Lock”? (5认同)
  • 我只需要注销并重新登录,不必重新启动(win 10) (2认同)

小智 52

现在有一个直接来自 Microsoft 的解决方案,用于将大写锁定映射到名为PowerToys的控制键。PowerToys 不涉及使用第三方工具或手动修改注册表(如果操作不当,可能会导致严重问题)。PowerToys 中处理此问题的工具是默认安装的,称为键盘管理器。它完全按预期工作 - 这是映射到 Ctrl 键的 Caps Lock 键的图像。

在此处输入图片说明

  • 哇...感谢您让我发现了一个不错的 gui 来执行此操作,因此我可以在更换键盘时启用它和禁用它...但最重要的是感谢您让我发现了电动玩具...哇哦。 .. (2认同)
  • ...但是,PowerToys 重新映射在远程桌面上不起作用。您可以在本地 PC 上重新映射,但远程桌面会话不会重新映射。在远程 PC 上运行相同的 PowerToys 也不起作用。(似乎不知何故,Ctrl 和 Caps Lock 按键都被发送到远程计算机。) (2认同)
  • 这是 [Microsoft Docs 页面和安装链接](https://docs.microsoft.com/en-us/windows/powertoys/install) (2认同)

moe*_*dol 28

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

希望这可以帮助。

  • 我可以使用它通过按大写锁定来切换语言吗? (2认同)

小智 23

我使用以下命令为 CAPS LOCK 键发送 CTRL,为 CTRL 键发送 ALT,并为 ALT 键发送 CAPS LOCK。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 "least significant byte, most significant byte" order,
;                    e.g. 0x1234 becomes `34,12`
;   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 (0x003a) 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
Run Code Online (Sandbox Code Playgroud)

  • 我非常感谢评论。我一直想知道这些代码是什么意思。很有帮助。 (6认同)

lox*_*axs 8

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

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

Capslock::Ctrl
Run Code Online (Sandbox Code Playgroud)

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

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


小智 8

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

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

它有着悠久的历史,但确实适用于 Windows 10,包括 64 位。运行一次即可安装驱动程序。


小智 6

这是用于交换 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
Run Code Online (Sandbox Code Playgroud)


小智 5

如果出于某种原因,您不想运行第三方工具,则可以使用一些 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;
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

166902 次

最近记录:

4 年,1 月 前