Caps Lock 키를 다른 키로 누르지 않은 경우 Esc 키를 Esc 키로 매핑하고 싶습니다. Windows 7에서 어떻게 할 수 있습니까?
Caps Lock 키를 다른 키로 누르지 않은 경우 Esc 키를 Esc 키로 매핑하고 싶습니다. Windows 7에서 어떻게 할 수 있습니까?
답변:
SharpKeys 를 사용하여 Escape에 다시 매핑 할 수 있습니다
그러나 키보드 드라이버를 작성하는 것 외에는 조건부 다시 매핑을 수행하는 현실적인 방법을 모릅니다.
이것은 정확히 당신이 원하는 것이 아니라 결함과 함께 살 수 있다면 매우 가깝습니다. 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
.
이것은 위에서 언급 한 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을 원했습니다).
Caps Lock
전에을 누른 경우에만 작동하는 것 같습니다 Shift
. Caps+Shift+X
작동하지만 작동 Shift+Caps+X
하지 않습니다.
Vim Tips Wiki에서 찾은 하나를 적용 하여 다음 AutoHotkey 스크립트를 사용합니다 . 구현은 약간 해 키지 만 "나에게 효과적"입니다. (2016-09-19 현재이 페이지의 다른 답변과 달리, 내가 알고있는 경고 없이이 문제를 완전히 해결합니다.)
원래 코더는 다음과 같이 언급했습니다.
스크립트는 또한 Control 및 다른 키를 누르고 시간 초과 기간 이전에 너무 빨리 둘 다 놓는 "가양 성"을 감지하고 피하려고 시도합니다.
키보드의 상태와 반응 시간 및 반응 시간에 따라 250ms 값을 조정하십시오. 이것은 아마도 자신의 취향에 따라 실험적으로 조정할 것입니다.
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
다음은 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) 파일로 저장하고 컴퓨터에서 가져 오거나 실행하십시오.
hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00
. 이 맵에 유용한 편집기 는 PlexData의 ScancodeMapping입니다 .
실제로 나는 여기에 완벽한 솔루션을 구축했다고 생각합니다.
Vim 사용자로서 이것은 필자의 필수이며 Windows에서 오랫동안 성공적으로 사용 해 왔습니다. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
실행 파일을 가리 키기 위해 regedit로 항목을 작성하면 간단하게 작동합니다.
종속성을 컴파일하고 설치하려면 저장소 README 및 기본 웹 사이트에서 인터 셉션을 확인하십시오.
또한 여기에 동일한 Linux 버전을 만들었습니다.
나는 이것과 비슷한 것을 찾고 있었지만 불행히도 여기서 답변의 AHK 스크립트는 나에게 잘 작동하지 않았습니다.
그러나 vim wiki 에서이 문제를 해결하는 솔루션을 찾았습니다 .
C:\Users\%username%\util\
)C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
에서 dual-key-remap.exe 파일을 드래그하십시오. 를 바로 가기를 만듭니다. 또는 마우스 오른쪽 버튼을 클릭하고 '바로 가기 만들기'를 선택한 다음 바로 가기를 시작 디렉토리로 이동하십시오.이 문서에 언급 된 Windows Server 2003 Resource Kit 도구에 포함 된 remapkey.exe 프로그램 은 Windows 7에서 잘 작동합니다.
나는 나를 위해 일한 답변에 대해 언급 할만 큼 평판이 충분하지 않습니다. 나는 아직도 그것을 upvoted.
pepper-chico의 답변이 저에게 효과적 이었습니다.
Caps Lock 키는 자체적으로 누르면 Esc 키로 작동합니다. 다른 것과 결합하면 Ctrl 키처럼 동작합니다. 또한 이것에 대한 동일한 사용 사례가 있습니다. 정력.
그가 제공 한 링크의 지시는 따르기에 충분히 간단합니다.
짧은 소스 코드를 직접 컴파일하는 것이 마음에 들지 않으면 아래 코드를 사용할 수 있습니다. 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;
}