Windows 7'de Caps Lock ile Kaçış ve Kontrol


23

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?



4
Koşullu yeniden atama orada kapsanmıyor
wizzard0

Kayıt değiştirerek yaptım: commons.lbl.gov/display/~jwelcher@lbl.gov/… bunu yaptıktan sonra bilgisayarınızı yeniden başlatmanız gerekiyor. Win7.
staticor

Yanıtlar:


8

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.


1
Caps Lock anahtarım zaten SharpKeys ile Kaçış olarak eşlendi.
Zameer Manji

6

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.


Sadece kaçmak için eşlemek istiyorsanız, bunu şu şekilde basitleştirebilirsiniz: $CapsLock::Escapeve sonra hemen return.
Kazark

Anlamaya çalışıyorum - komut dosyası ile kusur Caps Lock basıldığında ve serbest bırakıldığında, hem bir Ctrl hem de Escape gönderilir?
Rishi

5

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).


Bu senaryoyu kullanıyorum ve benim için çalışıyor. Caps Lock vim için Kontrol / Kaçış yeniden hatırlatmak için kullanıyorum.
Brandon

1
İşler! Açıklığa kavuşturmak için, bu bir AutoHotKey betiğidir. Buradan başlayın: autohotkey.com
Michael Fox

Tıklamamış ve özümle ilgili yorumları görmemiş olan okuyucuların yararı için, bu çözüm sadece Caps Lockbasmadan önce basarsanız çalışır gibi görünüyor Shift. Caps+Shift+Xçalışıyor ama Shift+Caps+Xçalışmıyor.
Zengin

4

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.

CapsLockCtrlEscape.ahk özü :

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'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.


Bağlantı verilen sayfalar değişirse yanıt geçersiz olabileceğinden, lütfen yanıtın önemli kısımlarını referans bağlantılarından alıntılayın. Şu anda 404 bu yüzden bu cevap işe yaramaz.
DavidPostill

Mükemmel puan. Cevabı güncelleyeceğim
Stryker

Bu aynı zamanda ScrollLock anahtarını CapsLock ile eşler. İstediğiniz bu değilse, değeri kullanı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 .
Appleshell

2

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\Runregedit 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:


2

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 .

  • İlk olarak, ikili anahtar yeniden eşleme adlı aşağıdaki uygulamayı indirin .
  • Zip'i seçtiğiniz bir yere çıkarın (Bu gibi yardımcı programları depolarım C:\Users\%username%\util\)
  • Aşağıdaki dizini açın: 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).
  • Giriş ve çıkış. Oturum açtıktan birkaç saniye sonra anahtarlar geri döner.


0

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.


0

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.