Я хочу иметь возможность сопоставить клавишу Caps Lock с Escape, если она не нажата с любой другой клавишей, и Control, если она есть. Как я могу сделать это на Windows 7?
Я хочу иметь возможность сопоставить клавишу Caps Lock с Escape, если она не нажата с любой другой клавишей, и Control, если она есть. Как я могу сделать это на Windows 7?
Ответы:
Вы можете переназначить его на Escape с SharpKeys
Однако я не знаю реалистичного способа выполнения условного переназначения, кроме написания драйвера клавиатуры.
Это не совсем то, что вы хотите, но очень близко, если вы можете жить с некоторыми недостатками. Вот скрипт 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
.
Это могло появиться на ранее упомянутой странице vim 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 (я действительно хотел именно для Vimium).
Caps Lock
перед нажатием Shift
. Caps+Shift+X
работает но Shift+Caps+X
не работает
Для этого я использую следующий скрипт AutoHotkey , адаптированный из сценария, который я нашел в Vim Tips Wiki . Реализация немного хакерская, но она «работает для меня». (И в отличие от других ответов на этой странице по состоянию на 2016-09-19 гг., Он полностью решает проблему без каких-либо предостережений, о которых мне известно.)
Оригинальный кодер отметил:
Сценарий также пытается обнаружить и избежать «ложных срабатываний», когда вы нажимаете Control и другую клавишу и отпускаете оба слишком быстро, то есть до истечения времени ожидания.
Обязательно настройте значение 250 мс в зависимости от того, насколько хороша или плоха ваша клавиатура, и от вашего собственного времени реакции. Это, вероятно, что-то, чтобы экспериментально настроить по своему вкусу.
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.
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) и импортируйте / выполните его на своем компьютере.
hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00
. Полезным редактором для этой карты является ScancodeMapping из PlexData .
На самом деле я думаю, что я построил идеальное решение здесь:
Как пользователь Vim, это необходимо для меня, и я уже давно успешно использую его в Windows. Я просто создаю запись HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
с помощью regedit, чтобы указать на исполняемый файл, и он просто работает.
Чтобы скомпилировать и установить зависимости, пожалуйста, проверьте репозиторий README и основной веб-сайт на предмет перехвата.
Я также создал версию для Linux того же здесь:
Я искал что-то похожее на это, но, к сожалению, скрипты AHK из ответов здесь не сработали для меня.
Тем не менее, я нашел решение, которое решило это для меня на вики- сайте vim .
C:\Users\%username%\util\
)C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
и перетащите туда файл dual-key-remap.exe, удерживая ALT, чтобы создать ярлык. (Или щелкните правой кнопкой мыши и выберите «Создать ярлык» и переместите ярлык в каталог запуска).Программа remapkey.exe, включенная в Windows Server 2003 Resource Kit Tools, упомянутые в этой статье, прекрасно работает в Windows 7.
У меня недостаточно репутации, чтобы комментировать ответ, который сработал для меня. Я все еще проголосовал за это все же.
Ответ Pepper-Chico работал на меня.
Клавиша Caps Lock работает как клавиша Escape, если нажата сама по себе. И ведет себя как клавиша Ctrl, если сочетается с другими. У меня также есть тот же вариант использования для этого. Vim.
Инструкция в ссылке, которую он предоставил, достаточно проста для подражания.
Если вы не возражаете против самостоятельной компиляции короткого исходного кода, используйте приведенный ниже код. Вам нужно скомпилировать его как консольное приложение 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;
}