Ánh xạ Caps Lock để thoát và kiểm soát trên Windows 7


23

Tôi muốn có thể ánh xạ phím Caps Lock thành Escape nếu nó không được nhấn với bất kỳ phím nào khác và Control nếu có. Làm thế nào tôi có thể làm điều đó trên Windows 7?



4
Chà, việc gán lại có điều kiện không được đề cập ở đó
wizzard0

Tôi đã thực hiện bằng cách sửa đổi đăng ký: commons.lbl.gov/display/~jwelcher@lbl.gov/ Khăn bạn cần khởi động lại máy tính sau khi thực hiện việc này. Win7.
tĩnh

Câu trả lời:


8

Bạn có thể sắp xếp lại nó để Thoát với SharpKeys

Tuy nhiên, tôi không biết một cách thực tế để thực hiện ánh xạ lại có điều kiện, ngoài việc viết trình điều khiển bàn phím.


1
Tôi đã có khóa Caps Lock được ánh xạ thành Escape với SharpKeys.
Zameer Manji

6

Đây không phải là chính xác những gì bạn muốn nhưng rất gần nếu bạn có thể sống với một số sai sót. Đây là tập lệnh AutoHotKey :

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

Nó ánh xạ lại Caps Lock thành Ctrl và gửi Escape khi bạn nhả phím. Phải mất một thời gian tôi mới quen với phím Escape được nhấn mỗi lần tôi buông phím Caps Lock. Tuy nhiên, nó khá vô dụng trên textareas của trang web vì nhấn Escape sẽ mất trọng tâm vào vùng văn bản.

Tôi đang tìm kiếm một giải pháp cho điều này mặc dù. Tôi có thể đi xa như viết một số loại trình điều khiển / bàn phím trong C nếu cần, haha.

Những phiền toái đặc thù của Vim: Nó làm cho các máy in không thể gõ bằng cách sử dụng kết hợp Ctrl-K và thường gây khó chịu trước khi bạn quen với nó. Nó hoạt động tốt với tôi mặc dù tôi sẽ làm mọi cách để tránh các phím Esc và Ctrl càng nhiều càng tốt.


Nếu bạn chỉ muốn ánh xạ nó để thoát, bạn có thể đơn giản hóa điều này thành: $CapsLock::Escapevà sau đó ngay lập tức return.
Kazark

Tôi đang cố gắng để hiểu - vì vậy lỗ hổng với kịch bản là khi Caps Lock được nhấn và phát hành, cả Ctrl và Escape đều được gửi?
Rishi

5

Điều này có thể đã xuất hiện trên trang vim wikia đã đề cập trước đó sau giải pháp của Rich ở trên.

; Author: fwompner gmail com
#InstallKeybdHook
SetCapsLockState, alwaysoff
Capslock::
Send {LControl Down}
KeyWait, CapsLock
Send {LControl Up}
if ( A_PriorKey = "CapsLock" )
{
    Send {Esc}
}
return

Đây không phải là công việc của tôi, nhưng tôi đã bắt đầu sử dụng nó và nó hoạt động chính xác như được mô tả, không có cảnh báo thực sự và vì nó không cố gắng ánh xạ bất kỳ trường hợp ngoại lệ nào (vì chúng không cần thiết) nên nó hoạt động khá độc đáo trong Chrome (tôi thực sự muốn nó cho Vimium).


Tôi đã sử dụng kịch bản này và nó hoạt động với tôi. Tôi đang sử dụng điều này để đóng lại Caps Lock để Control / Escape cho vim.
Brandon

1
Làm! Chỉ cần làm rõ, đó là một kịch bản AutoHotKey. Bắt đầu tại đây: autohotkey.com
Michael Fox

Vì lợi ích của những độc giả có thể không nhấp qua và xem các bình luận về ý chính của tôi, có vẻ như giải pháp này chỉ hoạt động nếu bạn nhấn Caps Locktrước khi nhấn Shift. Caps+Shift+Xhoạt động nhưng Shift+Caps+Xkhông.
Giàu

4

Tôi sử dụng tập lệnh AutoHotkey sau đây , được điều chỉnh từ tập lệnh tôi tìm thấy trên Wiki Vim Tips . Việc thực hiện là một chút hacky, nhưng nó "làm việc cho tôi." (Và không giống như các câu trả lời khác trên trang này vào năm 2016-09-19, nó hoàn toàn giải quyết vấn đề mà không có bất kỳ cảnh báo nào mà tôi biết.)

Các lập trình viên ban đầu lưu ý:

Tập lệnh cũng cố gắng phát hiện và tránh "dương tính giả" khi bạn nhấn Control và một phím khác và giải phóng cả hai quá nhanh, tức là trước khoảng thời gian chờ.

Đảm bảo điều chỉnh giá trị 250ms tùy thuộc vào mức độ tốt hay xấu của bàn phím và thời gian phản ứng của chính bạn. Đây có lẽ là một cái gì đó để điều chỉnh thử nghiệm theo ý thích của riêng bạn.

CapsLockCtrlEscape.ahk ý chính :

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

Dưới đây là một mục đăng ký ánh xạ khóa mũ để thoát trên 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

Lưu phần trên vào một tệp có phần mở rộng .reg (như mapCapLocks.reg) và nhập / thực thi nó trên máy của bạn.


Vui lòng trích dẫn các phần thiết yếu của câu trả lời từ (các) liên kết tham chiếu, vì câu trả lời có thể trở nên không hợp lệ nếu (các) trang được liên kết thay đổi. Hiện tại 404 nên câu trả lời này là vô ích.
DavidPostill

Điểm xuất sắc. Tôi sẽ cập nhật câu trả lời
Stryker

Điều này cũng sẽ ánh xạ phím ScrollLock thành CapsLock. Nếu đó không phải là điều bạn muốn, hãy sử dụng giá trị hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00. Trình chỉnh sửa hữu ích cho bản đồ này là ScancodeMapping từ PlexData .
Appleshell

2

Thật ra tôi nghĩ tôi đã xây dựng giải pháp hoàn hảo ở đây:

Là người dùng Vim, đây là điều bắt buộc đối với tôi và tôi đã sử dụng nó thành công trên Windows trong một thời gian dài. Tôi chỉ cần tạo một mục trên HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runvới regedit để trỏ đến tệp thực thi và nó chỉ đơn giản hoạt động.

Để biên dịch và cài đặt các phụ thuộc, vui lòng kiểm tra kho README và trang web chính để đánh chặn.

Tôi cũng đã tạo một phiên bản Linux giống nhau ở đây:


2

Tôi đang tìm kiếm một cái gì đó tương tự như thế này, nhưng thật không may, các kịch bản AHK từ các câu trả lời ở đây không hoạt động tốt với tôi.

Tuy nhiên, tôi đã tìm thấy một giải pháp giải quyết vấn đề này cho tôi trên wiki vim .

  • Đầu tiên, tải xuống ứng dụng sau có tên là dual-key-remap .
  • Trích xuất zip ở vị trí bạn chọn (Tôi lưu trữ các tiện ích như thế này trong C:\Users\%username%\util\)
  • Mở thư mục sau: C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\và kéo tệp dual-key-remap.exe ở đó, trong khi giữ ALT để tạo lối tắt. (Hoặc nhấp chuột phải và chọn 'tạo lối tắt' và di chuyển lối tắt đến thư mục khởi động của bạn).
  • Đăng nhập và đăng xuất. Một vài giây sau khi bạn đăng nhập vào các phím sẽ được bật lại.

0

Chương trình remapkey.exe có trong Windows Server 2003 Resource Kit Tools được đề cập trong bài viết này hoạt động độc đáo trong Windows 7.


1
xin vui lòng tránh sử dụng các liên kết như câu trả lời. thay vào đó, hãy thử giải thích tốt nhất nội dung của các liên kết và chỉ sau đó sử dụng chúng làm tài liệu tham khảo. nếu liên kết bị hỏng, toàn bộ câu trả lời của bạn cũng vậy.
Lorenzo Von Matterhorn

0

Tôi không có đủ danh tiếng để bình luận về câu trả lời phù hợp với mình. Tôi vẫn nâng cao nó mặc dù.

Câu trả lời của pepper-chico làm việc cho tôi.

Phím Caps Lock hoạt động như phím Escape nếu tự nhấn. Và hoạt động như phím Ctrl nếu kết hợp với người khác. Tôi cũng có trường hợp sử dụng tương tự cho điều này. Vim.

Các hướng dẫn trong liên kết ông cung cấp là đủ đơn giản để làm theo.


0

Nếu bạn không tự biên dịch mã nguồn ngắn, thì bạn có thể sử dụng mã bên dưới. Bạn cần biên dịch nó dưới dạng ứng dụng bảng điều khiển Windows. Ví dụ, trong dấu nhắc lệnh của Visual C ++, bạn có thể biên dịch nó với

cl /D_WIN32_WINNT=0x0401 remap_capslock.cpp /EHsc /link user32.lib

Phím ánh xạ lại hoạt động trong khi ứng dụng đang chạy. Không cần khởi động lại, đăng xuất / đăng nhập, v.v ... Nếu bạn cần ánh xạ lại để hoạt động cho các ứng dụng chạy với quyền quản trị viên, thì bạn cũng cần chạy ứng dụng remapper với tư cách quản trị viên. Đã sử dụng nó được vài ngày rồi (trên Windows 10), cho đến nay vẫn còn tốt.

// 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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.