Сопоставление Caps Lock для Escape и управления в Windows 7

23

Я хочу иметь возможность сопоставить клавишу Caps Lock с Escape, если она не нажата с любой другой клавишей, и Control, если она есть. Как я могу сделать это на Windows 7?

Zameer Manji
источник
2
Возможный дубликат Как отключить и переназначить клавишу Caps Lock?
Ƭᴇcʜιᴇ007
4
Ну, условное переназначение там не рассматривается
wizzard0
Я сделал это, изменив регистр: commons.lbl.gov/display/~jwelcher@lbl.gov/… после этого вам необходимо перезагрузить компьютер. Win7.
staticor

Ответы:

8

Вы можете переназначить его на Escape с SharpKeys

Однако я не знаю реалистичного способа выполнения условного переназначения, кроме написания драйвера клавиатуры.

wizzard0
источник
1
У меня уже есть ключ Caps Lock, связанный с Escape с помощью SharpKeys.
Zameer Manji
6

Это не совсем то, что вы хотите, но очень близко, если вы можете жить с некоторыми недостатками. Вот скрипт AutoHotKey :

$CapsLock::LControl
$CapsLock Up::Send {Escape}
return

Он переназначает Caps Lock на Ctrl и отправляет Escape, когда вы отпускаете клавишу. Мне потребовалось некоторое время, чтобы привыкнуть к нажатию клавиши Escape каждый раз, когда я отпускаю клавишу Caps Lock. Однако это в значительной степени бесполезно для текстовых областей сайта, потому что нажатие Escape теряет фокус на текстовой области.

Я ищу решение этой проблемы, хотя. Я мог бы пойти так далеко, как написать какой-нибудь хук драйвера / клавиатуры в C, если это необходимо, хаха.

Раздражения, характерные для Vim: он делает невозможным ввод текста в орграфах с помощью комбинации Ctrl-K и, как правило, раздражает, прежде чем вы привыкнете к нему. Это хорошо работает для меня, потому что я бы сделал все, чтобы избежать клавиш Esc и Ctrl, насколько это возможно.

Генри Хейккинен
источник
Если вы просто хотите отобразить его как escape, вы можете упростить это до: $CapsLock::Escapeи затем сразу return.
Казарк,
Я пытаюсь понять - таким образом, недостаток сценария в том, что при нажатии и отпускании Caps Lock отправляются и Ctrl, и Escape?
Риши
5

Это могло появиться на ранее упомянутой странице vim wikia после решения Рича выше.

; Author: fwompner gmail com
#InstallKeybdHook
SetCapsLockState, alwaysoff
Capslock::
Send {LControl Down}
KeyWait, CapsLock
Send {LControl Up}
if ( A_PriorKey = "CapsLock" )
{
    Send {Esc}
}
return

Это не моя работа, но я начал использовать его, и он работает точно так, как описано, никаких реальных предостережений, и, поскольку он не пытается отобразить какие-либо исключения (потому что они не нужны), он ведет себя довольно хорошо в Chrome (я действительно хотел именно для Vimium).

dragon788
источник
Я использовал этот скрипт, и он работает для меня. Я использую это для привязки Caps Lock к Control / Escape для vim.
Брэндон
1
Работает! Просто чтобы уточнить, это скрипт AutoHotKey. Начните здесь: autohotkey.com
Майкл Фокс,
Для читателей, которые, возможно, не просмотрели и не просмотрели комментарии к моей сути, кажется, что это решение работает, только если вы нажимаете Caps Lockперед нажатием Shift. Caps+Shift+Xработает но Shift+Caps+Xне работает
Богатое
4

Для этого я использую следующий скрипт AutoHotkey , адаптированный из сценария, который я нашел в Vim Tips Wiki . Реализация немного хакерская, но она «работает для меня». (И в отличие от других ответов на этой странице по состоянию на 2016-09-19 гг., Он полностью решает проблему без каких-либо предостережений, о которых мне известно.)

Оригинальный кодер отметил:

Сценарий также пытается обнаружить и избежать «ложных срабатываний», когда вы нажимаете Control и другую клавишу и отпускаете оба слишком быстро, то есть до истечения времени ожидания.

Обязательно настройте значение 250 мс в зависимости от того, насколько хороша или плоха ваша клавиатура, и от вашего собственного времени реакции. Это, вероятно, что-то, чтобы экспериментально настроить по своему вкусу.

CapsLockCtrlEscape.ahk gist :

g_LastCtrlKeyDownTime := 0
g_AbortSendEsc := false
g_ControlRepeatDetected := false

*CapsLock::
    if (g_ControlRepeatDetected)
    {
        return
    }

    send,{Ctrl down}
    g_LastCtrlKeyDownTime := A_TickCount
    g_AbortSendEsc := false
    g_ControlRepeatDetected := true

    return

*CapsLock Up::
    send,{Ctrl up}
    g_ControlRepeatDetected := false
    if (g_AbortSendEsc)
    {
        return
    }
    current_time := A_TickCount
    time_elapsed := current_time - g_LastCtrlKeyDownTime
    if (time_elapsed <= 250)
    {
        SendInput {Esc}
    }
    return

~*^a::
~*^b::
~*^c::
~*^d::
~*^e::
~*^f::
~*^g::
~*^h::
~*^i::
~*^j::
~*^k::
~*^l::
~*^m::
~*^n::
~*^o::
~*^p::
~*^q::
~*^r::
~*^s::
~*^t::
~*^u::
~*^v::
~*^w::
~*^x::
~*^y::
~*^z::
~*^1::
~*^2::
~*^3::
~*^4::
~*^5::
~*^6::
~*^7::
~*^8::
~*^9::
~*^0::
~*^Space::
~*^Backspace::
~*^Delete::
~*^Insert::
~*^Home::
~*^End::
~*^PgUp::
~*^PgDn::
~*^Tab::
~*^Return::
~*^,::
~*^.::
~*^/::
~*^;::
~*^'::
~*^[::
~*^]::
~*^\::
~*^-::
~*^=::
~*^`::
~*^F1::
~*^F2::
~*^F3::
~*^F4::
~*^F5::
~*^F6::
~*^F7::
~*^F8::
~*^F9::
~*^F10::
~*^F11::
~*^F12::
    g_AbortSendEsc := true
    return
Богатый
источник
3

Вот запись в реестре, которая отображает блокировку прописных букв для выхода из Windows 7.


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,3a,00,46,00,01,00,3a,00,00,00,00,00

Сохраните вышеперечисленное в файл с расширением .reg (например, mapCapLocks.reg) и импортируйте / выполните его на своем компьютере.

Stryker
источник
Пожалуйста, процитируйте основные части ответа по ссылочной ссылке (ссылкам), так как ответ может стать недействительным, если связанные страницы изменятся. В настоящее время 404, так что этот ответ бесполезен.
DavidPostill
Отличные баллы. Я буду обновлять ответ
Stryker
Это также сопоставит ключ ScrollLock с CapsLock. Если это не то, что вы хотите, используйте значение hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00. Полезным редактором для этой карты является ScancodeMapping из PlexData .
Яблочная ракушка
2

На самом деле я думаю, что я построил идеальное решение здесь:

Как пользователь Vim, это необходимо для меня, и я уже давно успешно использую его в Windows. Я просто создаю запись HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runс помощью regedit, чтобы указать на исполняемый файл, и он просто работает.

Чтобы скомпилировать и установить зависимости, пожалуйста, проверьте репозиторий README и основной веб-сайт на предмет перехвата.

Я также создал версию для Linux того же здесь:

pepper_chico
источник
2

Я искал что-то похожее на это, но, к сожалению, скрипты AHK из ответов здесь не сработали для меня.

Тем не менее, я нашел решение, которое решило это для меня на вики- сайте vim .

  • Сначала загрузите следующее приложение под названием dual-key-remap .
  • Извлеките zip-файл в папку по вашему выбору (я храню такие утилиты в C:\Users\%username%\util\)
  • Откройте следующий каталог: C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\и перетащите туда файл dual-key-remap.exe, удерживая ALT, чтобы создать ярлык. (Или щелкните правой кнопкой мыши и выберите «Создать ярлык» и переместите ярлык в каталог запуска).
  • Войти и выйти. Через несколько секунд после входа в систему ключи будут восстановлены.
любопытная-кошка
источник
0

Программа remapkey.exe, включенная в Windows Server 2003 Resource Kit Tools, упомянутые в этой статье, прекрасно работает в Windows 7.

джастин
источник
1
пожалуйста, избегайте использования ссылок в качестве ответов. вместо этого, попробуйте объяснить вам как можно лучше содержание ссылок и только потом использовать их в качестве ссылки. если ссылка когда-либо будет нарушена, то и весь ваш ответ.
Лоренцо фон Маттерхорн
0

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

Ответ Pepper-Chico работал на меня.

Клавиша Caps Lock работает как клавиша Escape, если нажата сама по себе. И ведет себя как клавиша Ctrl, если сочетается с другими. У меня также есть тот же вариант использования для этого. Vim.

Инструкция в ссылке, которую он предоставил, достаточно проста для подражания.

mrkvn
источник
0

Если вы не возражаете против самостоятельной компиляции короткого исходного кода, используйте приведенный ниже код. Вам нужно скомпилировать его как консольное приложение Windows. Например, в командной строке Visual C ++ вы можете скомпилировать его

cl /D_WIN32_WINNT=0x0401 remap_capslock.cpp /EHsc /link user32.lib

Перераспределение ключей работает во время работы приложения. Нет необходимости в перезагрузке, выходе из системы и т. Д. Если вам требуется переназначение для работы приложений, работающих с правами администратора, вам нужно запустить приложение переназначения также как администратор. Уже несколько дней пользуюсь им (на Windows 10), пока все хорошо.

// The app allows to remap CapsLock key to Esc (if pressed separately) or to Ctrl (if pressed with other keys).
// This may be useful for Vim.
// To compile from Visual C++ command prompt: 
//    cl /D_WIN32_WINNT=0x0401 remap_capslock.cpp /EHsc /link user32.lib
// Original source (which supported only Caps-Ctrl remapping): /superuser//a/1490007/22750

#include <windows.h>
#include <iostream>
#include <set>

HHOOK hook;
std::set<WORD> keys_down;
bool caps_down = false;
bool caps_was_down_with_another_key = false;

LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam) {
    KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *) lParam;
    INPUT input[3] = {{ INPUT_KEYBOARD }, { INPUT_KEYBOARD }, { INPUT_KEYBOARD }};

    if ((p->flags & LLKHF_INJECTED) == 0) {
        std::cout << "nCode=" << nCode << "\twParam=" << wParam << "\tvkCode=" << p->vkCode << "\tscanCode=" << p->scanCode << std::endl;
        bool keyup = wParam == WM_KEYUP || wParam == WM_SYSKEYUP;
        if (p->vkCode == VK_CAPITAL) {
            if (keyup) {
                if (caps_was_down_with_another_key) {
                    std::cout << "Remapping CAPSLOCK UP to CTRL UP" << std::endl;
                    input[0].ki.dwFlags = KEYEVENTF_KEYUP;
                    input[0].ki.wVk = VK_LCONTROL;
                    SendInput(1, input, sizeof (INPUT));
                } else {
                    std::cout << "Remapping CAPSLOCK UP to ESCAPE DOWN&UP" << std::endl;
                    input[0].ki.dwFlags = KEYEVENTF_KEYUP;
                    input[0].ki.wVk = VK_LCONTROL;
                    input[1].ki.dwFlags = 0;
                    input[1].ki.wVk = VK_ESCAPE;
                    input[2].ki.dwFlags = KEYEVENTF_KEYUP;
                    input[2].ki.wVk = VK_ESCAPE;
                    SendInput(3, input, sizeof (INPUT));
                }
                caps_down = false;
                caps_was_down_with_another_key = false;
            } else {
                std::cout << "Remapping CAPSLOCK DOWN to CTRL DOWN" << std::endl;
                caps_down = true;
                input[0].ki.dwFlags = 0;
                input[0].ki.wVk = VK_LCONTROL;
                SendInput(1, input, sizeof (INPUT));
            }
            return 1;
        } else {
            if (keyup) {
                keys_down.erase(p->vkCode);
            } else {
                keys_down.insert(p->vkCode);
            }
            std::cout << keys_down.size() << " keys down" << std::endl;
        }
        if (caps_down && !keys_down.empty()) {
            caps_was_down_with_another_key = true;
        }
    }
    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) {
        std::cout << "Error " << GetLastError() << std::endl;
        return 1;
    }
    std::cout << "Mapping ??? CAPSLOCK=>LCTRL and LCTRL=>CAPSLOCK..." << std::endl;
    while (GetMessage (&messages, NULL, 0, 0)) {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return 0;
}
Алекс Че
источник