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;
}