Mapowanie Caps Lock na Escape i Control w Windows 7


23

Chcę mieć możliwość mapowania klawisza Caps Lock na Escape, jeśli nie zostanie naciśnięty z żadnym innym klawiszem, i kontrolowanie, jeśli tak jest. Jak mogę to zrobić w systemie Windows 7?



4
Cóż, warunkowe przeniesienie nie jest tam uwzględnione
— wizzard0

Zrobiłem to, modyfikując rejestr: commons.lbl.gov/display/~jwelcher@lbl.gov /... po wykonaniu tej czynności musisz ponownie uruchomić komputer. Win7.
— statyczny lub

Odpowiedzi:


8

Możesz zmienić przypisanie do Escape za pomocą SharpKeys

Nie znam jednak realistycznego sposobu wykonywania mapowania warunkowego innego niż pisanie sterownika klawiatury.


1
Mam już przypisany klawisz Caps Lock do Escape za pomocą SharpKeys.
— Zameer Manji

6

Nie jest to dokładnie to, czego chcesz, ale bardzo blisko, jeśli możesz żyć z pewnymi wadami. Oto skrypt AutoHotKey :

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

Ponownie zamienia Caps Lock w Ctrl i wysyła Escape po zwolnieniu klawisza. Zajęło mi trochę czasu przyzwyczajenie się do naciskania klawisza Escape za każdym razem, gdy puszczam klawisz Caps Lock. Jest to jednak prawie bezużyteczne w obszarach tekstowych witryny, ponieważ naciśnięcie klawisza Escape traci skupienie na obszarach tekstowych.

Szukam rozwiązania tego. W razie potrzeby mógłbym napisać coś w rodzaju haka ze sterownikami / klawiaturami w C, haha.

Irytacje specyficzne dla Vima: uniemożliwia pisanie cyfr za pomocą kombinacji Ctrl-K i ogólnie jest denerwujące, zanim się przyzwyczaisz. Działa to jednak dla mnie dobrze, ponieważ zrobiłbym wszystko, aby w jak największym stopniu uniknąć klawiszy Esc i Ctrl.


Jeśli chcesz po prostu zamapować go na ucieczkę, możesz uprościć to do: $CapsLock::Escapea następnie natychmiast return.
— Kazark

Próbuję to zrozumieć - więc wadą skryptu jest to, że po naciśnięciu i zwolnieniu Caps Lock wysyłane są zarówno Ctrl, jak i Escape?
— Rishi

5

Mogło to pojawić się na wcześniej wspomnianej stronie wiki vim po powyższym rozwiązaniu Richa.

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

To nie jest moja praca, ale zacząłem go używać i działa dokładnie tak, jak opisano, bez prawdziwych zastrzeżeń, a ponieważ nie próbuje mapować żadnych wyjątków (ponieważ są niepotrzebne), działa całkiem ładnie w Chrome (naprawdę chciałem dla Vimium).


Używam tego skryptu i działa dla mnie. Używam tego do ponownego wiązania Caps Lock do Control / Escape dla vim.
— Brandon,

1
Pracuje! Dla wyjaśnienia jest to skrypt AutoHotKey. Zacznij tutaj: autohotkey.com
— Michael Fox,

Z korzyścią dla czytelników, którzy nie kliknęli i nie widzieli komentarzy w mojej treści, wydaje się, że to rozwiązanie działa tylko wtedy, gdy naciśniesz Caps Lockprzed naciśnięciem Shift. Caps+Shift+Xdziała, ale Shift+Caps+Xnie działa.
— Rich

4

Używam do tego następującego skryptu AutoHotkey , dostosowanego do tego, który znalazłem na Wiki Vim Tips . Implementacja jest nieco zaraźliwa, ale „działa dla mnie”. (I w przeciwieństwie do innych odpowiedzi na tej stronie z 19.09.2016, rozwiązuje on w pełni problem bez żadnych ostrzeżeń, o których wiem.)

Oryginalny programista zauważył:

Skrypt próbuje także wykryć i uniknąć „fałszywych alarmów”, gdy naciskasz Control i inny klawisz i zwalniasz oba zbyt szybko, tj. Przed upływem limitu czasu.

Koniecznie dostosuj wartość 250 ms w zależności od tego, jak dobra lub zła jest twoja klawiatura oraz od twojego czasu reakcji. Prawdopodobnie jest to coś, co można eksperymentalnie dostosować do własnych upodobań.

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

Oto wpis rejestru odwzorowujący klawisz Caps Escape na 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

Zapisz powyższe w pliku z rozszerzeniem .reg (np. MapCapLocks.reg) i zaimportuj / uruchom go na swoim komputerze.


Podaj zasadnicze części odpowiedzi z linków referencyjnych, ponieważ odpowiedź może stać się nieważna, jeśli połączona strona (strony) ulegną zmianie. Obecnie 404, więc ta odpowiedź jest bezużyteczna.
— DavidPostill

Doskonałe punkty. Zaktualizuję odpowiedź
— Stryker

Spowoduje to również mapowanie klawisza ScrollLock na CapsLock. Jeśli nie tego chcesz, użyj wartości hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00. Przydatnym edytorem tej mapy jest ScancodeMapping z PlexData .
— Jabłkowy

2

Właściwie myślę, że zbudowałem tutaj idealne rozwiązanie:

Jako użytkownik Vima jest to dla mnie koniecznością i od dawna używam go z powodzeniem w systemie Windows. Po prostu tworzę wpis HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runz regedit, aby wskazać plik wykonywalny i to po prostu działa.

Aby skompilować i zainstalować zależności, sprawdź repozytorium README i główną stronę internetową pod kątem przechwytywania.

Stworzyłem również tę samą wersję systemu Linux:


2

Szukałem czegoś podobnego do tego, ale niestety skrypty AHK z odpowiedzi tutaj nie działały dla mnie dobrze.

Znalazłem jednak rozwiązanie, które rozwiązało to dla mnie na wiki wiki .

  • Najpierw pobierz następującą aplikację o nazwie remap podwójnego klucza .
  • Rozpakuj zip w wybranej lokalizacji (przechowuję narzędzia takie jak te w C:\Users\%username%\util\)
  • Otwórz następujący katalog: C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\i przeciągnij tam plik dual-key-remap.exe, przytrzymując klawisz ALT, aby utworzyć skrót. (Lub kliknij prawym przyciskiem myszy i wybierz „utwórz skrót” i przenieś skrót do katalogu startowego).
  • Zaloguj się i wyloguj. Kilka sekund po zalogowaniu klucze zostaną ponownie powiązane.


0

Nie mam wystarczającej reputacji, aby skomentować odpowiedź, która zadziałała dla mnie. Nadal jednak to głosowałem.

Odpowiedź pepper-chico zadziałała dla mnie.

Klawisz Caps Lock zachowuje się jak klawisz Escape, jeśli zostanie naciśnięty samodzielnie. I zachowuje się jak klawisz Ctrl w połączeniu z innymi. Mam też ten sam przypadek użycia. Wigor.

Instrukcja w linku, który podał, jest wystarczająco prosta do naśladowania.


0

Jeśli nie masz nic przeciwko samodzielnemu skompilowaniu krótkiego kodu źródłowego, możesz użyć kodu poniżej. Musisz go skompilować jako aplikację konsoli Windows. Np. W wierszu polecenia Visual C ++ można go skompilować

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

Ponowne mapowanie klucza działa podczas działania aplikacji. Nie trzeba ponownie uruchamiać komputera, wylogowywać się / logować itp. Jeśli konieczne jest ponowne mapowanie, aby aplikacje działały z prawami administratora, należy również uruchomić aplikację remapper jako administrator. Używam go już od kilku dni (w systemie Windows 10), na razie jak na razie.

// 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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.