Картографування Caps Lock для втечі та управління в Windows 7


23

Я хочу мати змогу відобразити клавішу Caps Lock для втечі, якщо її не натискати жодною іншою клавішею, і керувати, якщо вона є. Як я можу це зробити в Windows 7?



4
Ну, умовне перепризначення там не охоплюється
чарівник0

Я зробив це, змінивши регістр: commons.lbl.gov/display/~jwelcher@lbl.gov/… після цього вам потрібно перезапустити комп'ютер. Win7.
staticor

Відповіді:


8

Ви можете перезавантажити його до Escape за допомогою SharpKeys

Однак я не знаю реалістичного способу виконання умовного перестановки, крім написання драйвера клавіатури.


1
У мене вже є свій ключ Caps Lock, відображений у програму Escape за допомогою SharpKeys.
Замер Манджі

6

Це не зовсім те, що ви хочете, але дуже близько, якщо ви можете жити з деякими вадами. Ось сценарій AutoHotKey :

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

Він переробляє Caps Lock до Ctrl і надсилає Escape, коли ви відпустите ключ. Мені знадобилося певний час, щоб звикнути до натискання клавіші Escape щоразу, коли я відпускав клавішу Caps Lock. Однак це дуже корисно для текстових веб-сайтів, оскільки натискання клавіші Escape втрачає увагу на текстовій області.

Я шукаю рішення для цього, хоча. Я можу зайти, якщо написати необхідний гачок драйвера / клавіатури в C, якщо потрібно, ха-ха.

Специфічні для Vim роздратування: унеможливлює набір диграфів за допомогою комбінації Ctrl-K і, як правило, дратує, перш ніж звикнути до нього. Для мене це добре працює, тому що я б робив усе, щоб максимально уникати клавіш Esc та Ctrl.


Якщо ви хочете просто нанести на карту його втечу, ви можете спростити це до: $CapsLock::Escapeі потім негайно return.
Казарк

Я намагаюся зрозуміти - тому недоліком сценарію є те, що при натисканні та відпуску Caps Lock надсилаються і Ctrl, і Escape?
Ріші

5

Це, можливо, з’явилося на раніше згадуваній сторінці wiki 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 (я дійсно хотілося це за Вімію).


Я використовував цей сценарій, і він працює для мене. Я використовую це для перезавантаження Caps Lock для Control / Escape for vim.
Брендон

1
Працює! Просто для уточнення, це сценарій AutoHotKey. Почніть тут: autohotkey.com
Майкл Фокс

На користь читачів, які, можливо, не натискали та не бачили коментарів до моєї суті, здається, це рішення працює лише в тому випадку, якщо ви натискаєте Caps Lockперед натисканням Shift. Caps+Shift+Xпрацює, але Shift+Caps+Xні.
Багатий

4

Для цього я використовую наступний скрипт AutoHotkey , адаптований з одного, який я знайшов у Вікі Tips Wiki . Реалізація трохи хитра, але "працює на мене". (І на відміну від інших відповідей на цій сторінці станом на 19.09.2016, він повністю вирішує питання без будь-яких застережень, про які я знаю.)

Оригінальний кодер зазначив:

Сценарій також намагається виявити та уникнути "помилкових позитивів", коли ви натискаєте клавішу Control та іншу клавішу та випускаєте обидва занадто швидко, тобто до періоду очікування.

Не забудьте змінити значення 250 мс залежно від того, наскільки клавіатура хороша чи погана, і власний час реакції. Це, мабуть, щось підлаштовувати експериментально на свій смак.

Суть 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

Відмінні бали. Я оновлю відповідь
Stryker

Це також відобразить карту ScrollLock для CapsLock. Якщо це не те, що ви хочете, використовуйте значення hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00. Корисним редактором для цієї карти є ScancodeMapping від PlexData .
Яблуко

2

Насправді я думаю, що тут я побудував ідеальне рішення:

Як користувач Vim, це для мене обов’язково, і я його успішно використовую в Windows протягом тривалого часу. Я просто створюю запис HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runіз regedit, щоб вказати на виконуваний файл, і він просто працює.

Для компіляції та встановлення залежностей перегляньте сховище README та головний веб-сайт на предмет перехоплення.

Я також створив тут же версію Linux:


2

Я шукав щось подібне до цього, але, на жаль, сценарії AHK з відповідей тут не працювали добре для мене.

Однак я знайшов рішення, яке вирішило це для мене на vim wiki .

  • Спочатку завантажте наступне додаток, яке називається подвійним ключем-перенастроювання .
  • Витягніть блискавку в обраному вами місці (я зберігаю такі комунальні послуги у C:\Users\%username%\util\)
  • Відкрийте таку каталог: C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\і перетягніть туди файл подвійного ключа-remap.exe, утримуючи ALT, щоб створити ярлик. (Або клацніть правою кнопкою миші та виберіть "створити ярлик", і перемістіть ярлик у вашу каталог запуску).
  • Увійти та вийти. Через кілька секунд після входу в систему ключі будуть відновлюватися.

0

Програма remapkey.exe, включена до Інструментів набору ресурсів Windows Server 2003, згаданих у цій статті, чудово працює в Windows 7.


1
будь ласка, уникайте використання посилань як відповідей. натомість спробуйте пояснити найкраще вміст посилань і лише потім використовуйте їх як посилання. якщо посилання коли-небудь буде розірвано, так і вся відповідь.
Лоренцо Фон Маттерхорн

0

У мене недостатньо репутації, щоб коментувати відповідь, яка працювала на мене. Я все-таки підтримував це.

відповідь перце-чіко працювала на мене.

Клавіша Caps Lock поводиться як клавіша Escape, якщо її натискати самостійно. І поводиться як ключ 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.