Caps Lock tuşunu başka bir tuşa basılmazsa Escape ile eşleştirmek ve eğer kontrol etmek istiyorsanız eşleştirmek istiyorum. Bunu Windows 7'de nasıl yapabilirim?
Caps Lock tuşunu başka bir tuşa basılmazsa Escape ile eşleştirmek ve eğer kontrol etmek istiyorsanız eşleştirmek istiyorum. Bunu Windows 7'de nasıl yapabilirim?
Yanıtlar:
SharpKeys ile Escape'e yeniden eşleştirebilirsiniz
Ancak, bir klavye sürücüsü yazmak dışında koşullu yeniden eşleme yapmanın gerçekçi bir yolunu bilmiyorum.
Bu tam olarak istediğiniz şey değil ama bazı kusurlarla yaşayabiliyorsanız çok yakın. İşte bir AutoHotKey betiği:
$CapsLock::LControl
$CapsLock Up::Send {Escape}
return
Caps Lock'u Ctrl'e hatırlatır ve anahtarı bıraktığınızda Escape gönderir. Caps Lock tuşunu her bıraktığımda Escape tuşuna basmak biraz zamanımı aldı. Ancak, web sitesi textareas'ta oldukça işe yaramaz çünkü Escape'e basmak metin alanına odaklanmayı kaybeder.
Buna rağmen bir çözüm arıyorum. Gerektiğinde C sürücüsünde bir tür sürücü / klavye kancası yazmak kadar gidebilirim, haha.
Vim'e özgü rahatsızlıklar: Ctrl-K kombinasyonunu kullanarak digrafların yazılmasını imkansız hale getirir ve alışmadan önce genellikle sataşmaktır. Esc ve Ctrl tuşlarından mümkün olduğunca kaçınmak için her şeyi yaparım çünkü benim için iyi çalışıyor.
$CapsLock::Escape
ve sonra hemen return
.
Bu, Rich'in yukarıdaki çözümünden sonra daha önce belirtilen vim wikia sayfasında görünmüş olabilir .
; Author: fwompner gmail com
#InstallKeybdHook
SetCapsLockState, alwaysoff
Capslock::
Send {LControl Down}
KeyWait, CapsLock
Send {LControl Up}
if ( A_PriorKey = "CapsLock" )
{
Send {Esc}
}
return
Bu benim işim değil, ama kullanmaya başladım ve tam olarak açıklandığı gibi çalışıyor, gerçek uyarılar yok ve herhangi bir istisnayı haritalamaya çalışmadığı için (gereksiz oldukları için) Chrome'da oldukça iyi davranıyor (gerçekten Vimium için istedim).
Caps Lock
basmadan önce basarsanız çalışır gibi görünüyor Shift
. Caps+Shift+X
çalışıyor ama Shift+Caps+X
çalışmıyor.
Vim Tips Wiki'de bulduğumdan uyarlanmış, bunun için aşağıdaki AutoHotkey komut dosyasını kullanıyorum . Uygulama biraz hileli, ama "benim için çalışıyor." (Ve 2016-09-19 itibariyle bu sayfadaki diğer cevapların aksine, farkında olduğum uyarılar olmadan sorunu tamamen çözüyor.)
Orijinal kodlayıcı şunları kaydetti:
Komut dosyası ayrıca Control ve başka bir tuşa bastığınız ve her ikisini de çok hızlı bir şekilde bıraktığınız, yani zaman aşımı süresinden önce "yanlış pozitifleri" algılamaya ve önlemeye çalışır.
Klavyenizin ne kadar iyi veya kötü olduğuna ve kendi tepki sürenize bağlı olarak 250 ms değerini ayarladığınızdan emin olun. Bu muhtemelen kendi zevkinize göre deneysel olarak ayarlanacak bir şeydir.
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'de kaçmak için büyük harf kilidini eşleyen bir kayıt defteri girdisi.
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
Yukarıdakini .reg uzantılı (mapCapLocks.reg gibi) bir dosyaya kaydedin ve makinenize alın / yürütün.
hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00
. Bu harita için kullanışlı editör PlexData'dan ScancodeMapping .
Aslında burada mükemmel çözümü oluşturduğumu düşünüyorum:
Bir Vim kullanıcısı olarak, bu benim için bir zorunluluktur ve bunu Windows'ta uzun süredir başarıyla kullanıyorum. Ben sadece HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
regedit ile yürütülebilir işaret edecek bir giriş oluşturmak ve sadece çalışır.
Bağımlılıkları derlemek ve kurmak için lütfen Havuz README'sine ve ana web sitesine Müdahale için bakınız.
Ayrıca burada bir Linux sürümü oluşturdum:
Buna benzer bir şey arıyordum, ama ne yazık ki buradaki cevaplardan AHK senaryoları benim için iyi çalışmadı.
Ancak, vim wiki'de bunu benim için çözen bir çözüm buldum .
C:\Users\%username%\util\
)C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
ve kısayol oluşturmak için ALT tuşunu basılı tutarken dual-key-remap.exe dosyasını buraya sürükleyin . (Veya sağ tıklayın ve 'kısayol oluştur' seçeneğini seçin ve kısayolu başlangıç dizininize taşıyın).Dahil remapkey.exe programı , Windows Server 2003 Kaynak Seti Araçları belirtilen bu makalede Windows 7'de güzel çalışıyor.
Benim için işe yarayan cevap hakkında yorum yapmak için yeterli itibarım yok. Yine de iptal ettim.
pepper-chico'nun yanıtı benim için çalıştı.
Caps Lock tuşu, kendiliğinden basılırsa Escape tuşu gibi davranır. Ve diğerleriyle birleştirilirse Ctrl tuşu gibi davranır. Bunun için de aynı kullanım durumu var. Vim.
Sağladığı bağlantıdaki talimatı takip etmek yeterince basit.
Kısa kaynak kodunu kendiniz derlemezseniz, aşağıdaki kodu kullanabilirsiniz. Windows konsol uygulaması olarak derlemeniz gerekir. Örneğin, Visual C ++ komut isteminde derleyebilirsiniz
cl /D_WIN32_WINNT=0x0401 remap_capslock.cpp /EHsc /link user32.lib
Anahtar yeniden eşlemesi uygulama çalışırken çalışır. Yeniden başlatma, oturum açma / kapatma vb. İşlemlerine gerek yoktur. Yönetici haklarıyla çalışan uygulamalarda çalışmak için yeniden eşleme yapmanız gerekiyorsa, yeniden eşleme uygulamasını yönetici olarak da çalıştırmanız gerekir. Şimdiye kadar birkaç gündür (Windows 10'da) kullanıyorum, şimdiye kadar çok iyi.
// 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;
}