[Из песочницы] Переключения языка ввода в Windows с помощью CapsLock
Суть проблемы
ОС Windows 7 предоставляет пользователю долгожданную возможность переключать языки ввода по обратному апострофу:
Казалось бы, удобно, но нет. Лично я вижу следующие недостатки:
- маленькая клавиша
- на домашней Linux-машине всё-таки CapsLock настроен
- пропала буква Ё
- пропала тильда и обратный апостроф
Для тех, кто как и я, обречён ходить на develop/production сервера с использованием PuTTY, потеря тильды и обратного апострофа весьма чувствительна. Я не выдержал и месяца, хотя, казалось бы, как легко запомнить Alt+126 и Alt+96. Надо что-то делать!
Меняем скан-коды
Решение для переключения раскладки по CapsLock — это переопределение скан-кодов через реестр. Есть множество описаний как это сделать. Я могу предложить прочитать одно из них по ссылке: www.howtogeek.com.
Готовый результат выглядит вот так (файл SwitchLangByCaps.reg):
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,04,00,00,00,29,00,3a,00,3a,00,46,00,56,00,29,00,00,00,00,00
Как можно видеть, в реестре прописывается одно или несколько правил подмены вида:
<что выдавать, если><пришёл такой сканкод><что выдавать, если><пришёл такой сканкод>...
Так что нам надо распланировать алгоритм перестановки. Первая перестановка очевидна — по нажатию CapsLock (0×3a) эмулировать нажатие на Ё (0×29). Вторая тоже примерно понятна — для того, чтобы всё-таки оставить функциональность капса, требуется переназначить на него какую-нибудь ненужную клавишу. В моём примере этой клавишей оказался ScrolLock (0×46). А вот третья перестановка отвечает за спасение буквы Ё. Для этого хитрого кода нам нужна «ненужная клавиша» с текстовой клавиатуры, Pause/Break не подойдёт. Однако, тут нам повезло. Даже на полностью задействованной русскоязычной раскладке клавиатуры есть дублирующиеся клавиши:
Вот эта кнопка в левом нижнем углу и подойдёт на роль замены букве Ё, а равно и тильде с обратным апострофом. Имеет она сканкод 0×56 и отсутствует на большинстве клавиатур, так что именно её будем эмулировать при нажатии на Ё-кнопку.
На этом этапе можно произвести изменения в реестре и отправить машину в перезагрузку.
Добавляем раскладки
Как несложно догадаться, после перезагрузки вместо буквы Ё мы получим косую черту. Для исправления ситуации, требуется поправить имеющуюся клавиатурную раскладку. Редактировать раскладки клавиатуры можно посредством утилиты Microsoft Keyboard Layout Creator 1.4. Использование программы несложно — загружаем исходную клавиатуру из списка, делаем изменения (меняем символы клавиши 0×56 на требуемые буквы Ёё), сохраняем source-файл и собираем установочный пакет из меню Project.
Ту же операцию следует проделать и с английской клавиатурой, изменив поведение обратного слэша на обратный апостроф и тильду.
В результате должны получиться две папки с установочным пакетом для клавиатурной раскладки. Выполняем установку каждой, запуская setup.exe и переходим к следующему шагу.
Настройка раскладок
Открываем «языковые настройки». Для начала, выставьте переключение раскладок по Grave accent, как показано на первой картинке этой статьи. Затем добавьте только что установленные раскладки: US-Custom и Russian-Custom. И наконец, установите дефолтный ввод через US-Custom. Это необходимо, так как раскладку US удалить не получится, но в этом тоже есть плюс — теперь при смене языка ввода меняется размер значка в трее и гораздо легче заметить, попал ли ты по CapsLock или промахнулся. Результат должен выглядеть как-то так:
Если всё прошло удачно, то вы получили возможность переключения языков ввода по CapsLock, не поплатившись за это ничем существенным. Можно спокойно покупать в офис и на работу одинаковые клавиатуры и, не задумываясь больше над алгоритмом переключения, получать удвоенное удовольствие от слепой десятипальцевой печати.
Приложение
Готовые проекты раскладок, их исходники и патч к реестру можно найти по ссылке: Я.Диск.
Комментарии (29)
14 июля 2016 в 11:45
0↑
↓
Способ для ламеров — усановить PuntoSwitcher. А вдруг кому-то понадобится за вашим ПК поработать? В PS хоть быстро вернуть можно, а в Вашм варианте — кроме Вас никто знать не будет как обратно вернуться.14 июля 2016 в 11:49
0↑
↓
да, пунто срабатывает. именно поэтому раньше у меня не возникало такой проблемы. Но на новом месте работы пунто под запретом, увы.14 июля 2016 в 11:53
0↑
↓
По-поводу изменений в реестр — да, увы, это затрагивает всех пользователей (хотя я не проверял). Но я и не претендую на универсальность — просто ещё один способ решения проблемы плюс собрал вместе полезную информацию.14 июля 2016 в 11:58
–3↑
↓
А что за место? (ненароком бы не вляпаться)14 июля 2016 в 15:04
0↑
↓
Присоединяюсь к вопросу
14 июля 2016 в 12:00
0↑
↓
А вдруг кому-то понадобится за вашим ПК поработать? В PS хоть быстро вернуть можно, а в Вашм варианте — кроме Вас никто знать не будет как обратно вернуться.
Ну, для тех, кто считает, что единственно правильный способ переключения раскладок существует и способ этот — CapsLock, это даже плюс. А вообще в новых виндах есть способ универсальный и работающий на всех чужих компах — Win+Space.
P.S. Единственным более (или хотя бы не менее) правильным способом, чем CapsLock, я готов признать использование немодальных переключателей. К сожалению, других (кроме CapsLock) бесполезных клавиш на клавиатуре нет.
14 июля 2016 в 13:15
0↑
↓
Можно ещё клавишу контекстного меню использовать — ей редко пользуются по назначению. Я правда не знаю возможно ли это в Windows, но если влезть в скан коды, как в статье, то врятли возникнут проблемы.Кроме того есть совет актуальный для владельцев MS Nature 4k. В комплекте с клавиатурой шла утилитка, которая позволяла переопределять клавиши. Правда это было 9 лет назад, как сейчас дела я не знаю.
14 июля 2016 в 11:46
+2↑
↓
Recaps же14 июля 2016 в 12:47
0↑
↓
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelHookProc, GetModuleHandle(NULL), 0);
ну то есть совсем другой подход, чем я предлагаю. Через хуки-то любой сможет ;)14 июля 2016 в 15:04
0↑
↓
Увы, Recaps не работает на Win10 (возможно и 8 — не проверял) в Modern приложениях.
14 июля 2016 в 11:51
0↑
↓
Большое спасибо за статью! (Сам хотел такую написать. Не успел.)
14 июля 2016 в 11:55
0↑
↓
сам удивлён, что нашёл время :)
14 июля 2016 в 11:55
0↑
↓
Попробуйте посмотреть в сторону Capslang (http://flydom.ru/capslang/). Сам пользуюсь версией caps-min.exe на Win 7 больше полугода. Пока недочетов не выявил14 июля 2016 в 11:55
0↑
↓
Недостатки:
Не переключает раскладку в некоторых программах
собственна вот…
14 июля 2016 в 12:09
0↑
↓
Я потому и написал, что «недочетов не выявил». За полгода не встретился с таким приложением, в котором были бы проблемы с переключением раскладки. Пользуюсь офисным пакетом от Microsoft, Visual Studio 2013 + дополнительные инструменты для C#/JavaScript/SQL, различные мессенджеры и тулы для конференц связи и т.п. Но всё зависит от используемых приложений.Самого же в первую очередь привлёк очень маленький размер (5 КБ)
14 июля 2016 в 12:11
0↑
↓
ок. постараюсь опробовать. спасибо за рекомендацию!
14 июля 2016 в 11:56 (комментарий был изменён)
0↑
↓
Для тех, у кого стоит Punto Switcher — там эта функция есть в настройках переключения. Работает вроде корректно…Блин! Даже прочитав комментарии, не успеешь не написать одинаковый…
14 июля 2016 в 11:58
0↑
↓
я в курсе. пользовался именно этой фичей., но вот у нас в конторе пунто == харам.
14 июля 2016 в 12:27
0↑
↓
AutoHotKey (https://autohotkey.com/) — кроме этого можно настраивать практически все что угодано через собственные скрипты.14 июля 2016 в 13:46
0↑
↓
Ну и, собственно, готовое решение, к которому пришёл через кучу проб и ошибок. Дело в том, что много других решений рано или поздно срабатывали не так, как надо, только текущее решение всегда работает безупречно. Первым делом я переназначил CapsLock на другую клавишу, например, RAlt или F13, это можно легко сделать через SharpKeys. Теперь сам код AHK (для RAlt):RAlt::
if (Key="1")
returnelse
SetKeyDelay -1
Send {Blind}{Ctrl DownTemp}{Shift DownTemp}
SetKeyDelay -1
Send {Blind}{Ctrl Up}{Shift Up}{RAlt Up}
returnПлюс можно дальше назначать комбинации клавиш, которые будут работать, не переключая язык, например, уменьшение/увеличение громкости через CapsLock и колесо мыши:
RAlt & WheelUp::
Send {Volume_Up}
returnRAlt & WheelDown:
Send {Volume_Down}
return
14 июля 2016 в 12:28
0↑
↓
Еще лет 7 назад сделал в MLC раскладку «Английский — Русский». А потом и девушка перешла. (Правда она капс всё время не выключает, что меня привычного к всегда Английскому немного сбивает.)
Punto switcher не люблю, так как в свое время нахватался с ним очень много глюков. (Справедливости ради в некоторых играх есть проблемы что с PS, что с раскладкой, но последние время такое всё реже)
14 июля 2016 в 12:35
0↑
↓
хм… А что вы подразумеваете под MLC?14 июля 2016 в 12:37
0↑
↓
Извиняюсь, MKLC — Microsoft Keyboard Layout Creator, который на скриншоте в статье…
14 июля 2016 в 12:39
+1↑
↓
ну дык больше подробностей! Вам удалось сделать переключение по капсу средствами одной только раскладки?14 июля 2016 в 12:51
0↑
↓
Ну да, просто забил в режим капса русские буквы… И в режиме caps+shift большие русские. (Подробностей не помню, так как было лет 7 назад, еще с XP)
Всего одна раскладка. Где-то даже есть её инсталятор, если надо могу поискать.
14 июля 2016 в 12:53
0↑
↓
чорть, очевидная идея :)
14 июля 2016 в 15:03
0↑
↓
Если кому интересно, ещё один способ переключения по CapsLock — мне понравился тем, что переключатель глобальный для всех приложений, недавняя публикация habrahabr.ru/post/30188214 июля 2016 в 15:15
0↑
↓
интересный пост. спасибо!
14 июля 2016 в 15:04
0↑
↓
Костыли какие-то. Я просто в автозагрузку lswitch.exe 20 (гуглится) поставил и радуюсь. А пунто ещё и забывает переключать иногда, и тогда капс залипает во включенном состоянии.