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?
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?
Câu trả lời:
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.
Đâ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.
$CapsLock::Escape
và sau đó ngay lập tức return
.
Đ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).
Caps Lock
trước khi nhấn Shift
. Caps+Shift+X
hoạt động nhưng Shift+Caps+X
không.
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
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.
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 .
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\Run
vớ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:
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 .
C:\Users\%username%\util\
)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).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.
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.
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;
}