Windows 7에서 이스케이프 및 제어를위한 Caps Lock 매핑


23

Caps Lock 키를 다른 키로 누르지 않은 경우 Esc 키를 Esc 키로 매핑하고 싶습니다. Windows 7에서 어떻게 할 수 있습니까?



4
음, 조건부 재 할당이 적용되지 않습니다
wizzard0

registers : commons.lbl.gov/display/~jwelcher@lbl.gov/… 수정하여 만들었습니다 . 이렇게 한 후에 컴퓨터를 다시 시작해야합니다. Win7.
staticor

답변:


8

SharpKeys 를 사용하여 Escape에 다시 매핑 할 수 있습니다

그러나 키보드 드라이버를 작성하는 것 외에는 조건부 다시 매핑을 수행하는 현실적인 방법을 모릅니다.


1
이미 Caps Lock 키가 SharpKeys를 사용하여 Escape에 매핑되어 있습니다.
Zameer Manji

6

이것은 정확히 당신이 원하는 것이 아니라 결함과 함께 살 수 있다면 매우 가깝습니다. AutoHotKey 스크립트 는 다음과 같습니다 .

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

Caps Lock을 Ctrl로 다시 매핑하고 키를 놓으면 Esc를 보냅니다. Caps Lock 키를 놓을 때마다 Esc 키를 누르는 데 익숙해지기까지 시간이 걸렸습니다. 그러나 Esc 키를 누르면 텍스트 영역에 초점을 잃기 때문에 웹 사이트 텍스트 영역에서는 거의 쓸모가 없습니다.

나는 이것에 대한 해결책을 찾고 있습니다. 필요한 경우 C로 일종의 드라이버 / 키보드 훅을 쓸 수 있습니다.

Vim 관련 성가신 : Ctrl-K 조합을 사용하여 입력 할 수없고 일반적으로 익숙해지기 전에 일반적으로 성가시다. Esc 및 Ctrl 키를 최대한 피하기 위해 아무것도하지 않기 때문에 잘 작동합니다.


이스케이프하도록 매핑하려는 경우 $CapsLock::Escape다음과 같이 단순화하면됩니다 return.
Kazark

이해하려고합니다-스크립트의 결함은 Caps Lock을 눌렀다 놓을 때 Ctrl과 Escape가 모두 전송된다는 것입니다.
Rishi

5

이것은 위에서 언급 한 Rich의 솔루션 이후 에 위에서 언급 한 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을 원했습니다).


나는이 스크립트를 사용하고 있으며 그것은 나를 위해 작동합니다. vis의 Caps Lock을 Control / Escape에 리 바인드하기 위해 이것을 사용하고 있습니다.
Brandon

1
공장! 명확히하기 위해 AutoHotKey 스크립트입니다. 여기서 시작하십시오 : autohotkey.com
Michael Fox

클릭하지 않고 내 요점에 대한 의견을 보지 못한 독자들을 위해이 솔루션은을 누르기 Caps Lock전에을 누른 경우에만 작동하는 것 같습니다 Shift. Caps+Shift+X작동하지만 작동 Shift+Caps+X하지 않습니다.
Rich

4

Vim Tips Wiki에서 찾은 하나를 적용 하여 다음 AutoHotkey 스크립트를 사용합니다 . 구현은 약간 해 키지 만 "나에게 효과적"입니다. (2016-09-19 현재이 페이지의 다른 답변과 달리, 내가 알고있는 경고 없이이 문제를 완전히 해결합니다.)

원래 코더는 다음과 같이 언급했습니다.

스크립트는 또한 Control 및 다른 키를 누르고 시간 초과 기간 이전에 너무 빨리 둘 다 놓는 "가양 성"을 감지하고 피하려고 시도합니다.

키보드의 상태와 반응 시간 및 반응 시간에 따라 250ms 값을 조정하십시오. 이것은 아마도 자신의 취향에 따라 실험적으로 조정할 것입니다.

CapsLockCtrlEscape.ahk 요점 :

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) 파일로 저장하고 컴퓨터에서 가져 오거나 실행하십시오.


링크 된 페이지가 변경되면 답변이 유효하지 않을 수 있으므로 참조 링크에서 답변의 필수 부분을 인용하십시오. 현재 404 이므로이 답변은 쓸모가 없습니다.
DavidPostill

훌륭한 포인트. 나는 대답을 업데이트합니다
스트라이커

또한 ScrollLock 키를 CapsLock에 매핑합니다. 원하는 것이 아닌 경우 value를 사용하십시오 hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00. 이 맵에 유용한 편집기 는 PlexData의 ScancodeMapping입니다 .
Appleshell

2

실제로 나는 여기에 완벽한 솔루션을 구축했다고 생각합니다.

Vim 사용자로서 이것은 필자의 필수이며 Windows에서 오랫동안 성공적으로 사용 해 왔습니다. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run실행 파일을 가리 키기 위해 regedit로 항목을 작성하면 간단하게 작동합니다.

종속성을 컴파일하고 설치하려면 저장소 README 및 기본 웹 사이트에서 인터 셉션을 확인하십시오.

또한 여기에 동일한 Linux 버전을 만들었습니다.


2

나는 이것과 비슷한 것을 찾고 있었지만 불행히도 여기서 답변의 AHK 스크립트는 나에게 잘 작동하지 않았습니다.

그러나 vim wiki 에서이 문제를 해결하는 솔루션을 찾았습니다 .

  • 먼저 dual-key-remap 이라는 다음 앱을 다운로드하십시오 .
  • 원하는 위치에 zip을 추출하십시오 (이와 같이 유틸리티를 저장합니다 C:\Users\%username%\util\)
  • 다음 디렉토리를 열고 ALT를 누른 상태C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\ 에서 dual-key-remap.exe 파일을 드래그하십시오. 를 바로 가기를 만듭니다. 또는 마우스 오른쪽 버튼을 클릭하고 '바로 가기 만들기'를 선택한 다음 바로 가기를 시작 디렉토리로 이동하십시오.
  • 로그인 및 로그 아웃하십시오. 로그인 후 몇 초 후에 키가 리바운드됩니다.


0

나는 나를 위해 일한 답변에 대해 언급 할만 큼 평판이 충분하지 않습니다. 나는 아직도 그것을 upvoted.

pepper-chico의 답변이 저에게 효과적 이었습니다.

Caps Lock 키는 자체적으로 누르면 Esc 키로 작동합니다. 다른 것과 결합하면 Ctrl 키처럼 동작합니다. 또한 이것에 대한 동일한 사용 사례가 있습니다. 정력.

그가 제공 한 링크의 지시는 따르기에 충분히 간단합니다.


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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.