Я хочу мати змогу відобразити клавішу Caps Lock для втечі, якщо її не натискати жодною іншою клавішею, і керувати, якщо вона є. Як я можу це зробити в Windows 7?
Я хочу мати змогу відобразити клавішу Caps Lock для втечі, якщо її не натискати жодною іншою клавішею, і керувати, якщо вона є. Як я можу це зробити в 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
.
Це, можливо, з’явилося на раніше згадуваній сторінці 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
перед натисканням Shift
. Caps+Shift+X
працює, але Shift+Caps+X
ні.
Для цього я використовую наступний скрипт AutoHotkey , адаптований з одного, який я знайшов у Вікі Tips Wiki . Реалізація трохи хитра, але "працює на мене". (І на відміну від інших відповідей на цій сторінці станом на 19.09.2016, він повністю вирішує питання без будь-яких застережень, про які я знаю.)
Оригінальний кодер зазначив:
Сценарій також намагається виявити та уникнути "помилкових позитивів", коли ви натискаєте клавішу 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 wiki .
C:\Users\%username%\util\
)C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
і перетягніть туди файл подвійного ключа-remap.exe, утримуючи ALT, щоб створити ярлик. (Або клацніть правою кнопкою миші та виберіть "створити ярлик", і перемістіть ярлик у вашу каталог запуску).Програма remapkey.exe, включена до Інструментів набору ресурсів Windows Server 2003, згаданих у цій статті, чудово працює в Windows 7.
У мене недостатньо репутації, щоб коментувати відповідь, яка працювала на мене. Я все-таки підтримував це.
відповідь перце-чіко працювала на мене.
Клавіша Caps Lock поводиться як клавіша Escape, якщо її натискати самостійно. І поводиться як ключ Ctrl у поєднанні з іншими. У мене також є той самий випадок використання для цього. Вим.
Інструкція у наданому ним посиланні досить проста.
Якщо ви не проти скласти короткий вихідний код самостійно, тоді ви можете скористатися цим кодом нижче. Скомпілювати його потрібно як додаток консолі 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;
}