Карта Capslock для управления в 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 сбросить мои крышки блокировки отображения. Но делать это снова таким же образом работало после другого перезапуска.
Джек О'Коннор

38
Если кому-то еще, как мне, нужен последний кусок головоломки: вставьте приведенное выше в новый текстовый файл, сохраните его с .regрасширением, дважды щелкните файл, чтобы применить изменения в реестре, затем перезагрузите компьютер.
Майк Ниблинг

4
Как вы можете сопоставить это Caps Lockпотом?
Этеш Чоудхури

7
@EhteshChoudhury Вы можете удалить запись «Карта кодов сканирования» в разделе реестра, перезагрузиться, и поведение по умолчанию будет восстановлено.
божоле

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
Иметь ответ на вопрос "скопировать и вставить в Linux" в стиле Linux!
mikezter

3
Шутки в сторону. Я скучаю по наличию * initrc скриптов. Благодарю.
stewSquared

6
Вы, сэр, сделали использование Windows сегодня немного менее жалким опытом. За это я благодарю вас.
двоичный масон

18

Вы можете использовать SharpKeys для сопоставления любого ключа с любым другим ключом в Windows 7, 8 или 10. Это гораздо проще и чище, чем вносить изменения в реестр самостоятельно.

Надеюсь это поможет.


2
Могу ли я использовать это для переключения языков нажатием кнопки caps lock?
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]. Код ключа не является обязательным и по умолчанию используется ключ контекстного меню. Другим хорошим кандидатом является ключ CapsLock с кодом ключа 20.

lswitch 20

Добавьте его в автозагрузку.


это работает, однако функциональность блокировки шапки теряется. Любая идея о том, как определить функциональность Caps Lock для комбинации Shift + Caps Lock?
thanos.a

2

Я использовал AutoHotKey, чтобы сделать это.

У меня была бы ссылка в каталоге автозагрузки для запуска очень простого ахк-скрипта:

Capslock::Ctrl

Дело в том, что Autohotkey не запускается от имени администратора, поэтому он не влияет на привилегированные окна, если вы не используете планировщик задач вместо каталога запуска для запуска сценария при входе в систему с более высокими привилегиями. Вторая проблема заключается в том, что иногда сценарий зависает при возобновлении сна, поэтому вам может потребоваться перезагрузить его, что раздражает.

AutoHotKey лучше подходит для более сложных задач, таких как написание макросов.


Я попробовал решение AutoHotkey, и я не рекомендую его. Это не будет работать хорошо, если у вас высокая скорость автоповтора, низкая задержка. Он также не очень хорошо сочетается с xkeymacs, что заставляет ключи emacs работать практически везде в Windows.
Реб. Кабин

Я не использую emacs, автоматически открываю файл .ahk при входе в систему и нахожу это решение самым простым и портативным на сегодняшний день
поклонник Бьоркса номер один

2

Неиссякаемый набор инструментов sysinternals также предоставляет небольшую программу для переключения capslock с помощью control - ctrl2cap.exe.


Добро пожаловать в Супер пользователя. Пожалуйста, прочтите Как рекомендовать программное обеспечение, затем отредактируйте свой ответ, включив в него хотя бы минимально необходимую информацию (элементы выделены жирным шрифтом ). Сообщения без этой информации могут быть удалены. Спасибо за помощь.
Я говорю, восстановите Монику

1

Если по какой-то причине вы не хотите запускать сторонние инструменты, возможно сделать это самостоятельно с небольшим количеством C. Благодаря блестящему ответу Сусама Пала я собрал фрагмент кода ниже.

Это практически клавиатурный шпион. Он прослушивает нажатия клавиш, фиксирует их и создает ввод с клавиатуры с учетом соответствия. Для работы должно быть запущено нижеприведенное консольное приложение.

Вам нужно будет как-то скомпилировать это. Я использовал 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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.