Суть проблемы
ОС 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 (0x3a) эмулировать нажатие на Ё (0x29). Вторая тоже примерно понятна — для того, чтобы всё-таки оставить функциональность капса, требуется переназначить на него какую-нибудь ненужную клавишу. В моём примере этой клавишей оказался ScrolLock (0x46). А вот третья перестановка отвечает за спасение буквы Ё. Для этого хитрого кода нам нужна «ненужная клавиша» с текстовой клавиатуры, Pause/Break не подойдёт. Однако, тут нам повезло. Даже на полностью задействованной русскоязычной раскладке клавиатуры есть дублирующиеся клавиши:
Вот эта кнопка в левом нижнем углу и подойдёт на роль замены букве Ё, а равно и тильде с обратным апострофом. Имеет она сканкод 0x56 и отсутствует на большинстве клавиатур, так что именно её будем эмулировать при нажатии на Ё-кнопку.
На этом этапе можно произвести изменения в реестре и отправить машину в перезагрузку.
Добавляем раскладки
Как несложно догадаться, после перезагрузки вместо буквы Ё мы получим косую черту. Для исправления ситуации, требуется поправить имеющуюся клавиатурную раскладку. Редактировать раскладки клавиатуры можно посредством утилиты Microsoft Keyboard Layout Creator 1.4. Использование программы несложно — загружаем исходную клавиатуру из списка, делаем изменения (меняем символы клавиши 0x56 на требуемые буквы Ёё), сохраняем source-файл и собираем установочный пакет из меню Project.
Ту же операцию следует проделать и с английской клавиатурой, изменив поведение обратного слэша на обратный апостроф и тильду.
В результате должны получиться две папки с установочным пакетом для клавиатурной раскладки. Выполняем установку каждой, запуская setup.exe и переходим к следующему шагу.
Настройка раскладок
Открываем «языковые настройки». Для начала, выставьте переключение раскладок по Grave accent, как показано на первой картинке этой статьи. Затем добавьте только что установленные раскладки: US-Custom и Russian-Custom. И наконец, установите дефолтный ввод через US-Custom. Это необходимо, так как раскладку US удалить не получится, но в этом тоже есть плюс — теперь при смене языка ввода меняется размер значка в трее и гораздо легче заметить, попал ли ты по CapsLock или промахнулся. Результат должен выглядеть как-то так:
Если всё прошло удачно, то вы получили возможность переключения языков ввода по CapsLock, не поплатившись за это ничем существенным. Можно спокойно покупать в офис и на работу одинаковые клавиатуры и, не задумываясь больше над алгоритмом переключения, получать удвоенное удовольствие от слепой десятипальцевой печати.
Приложение
Готовые проекты раскладок, их исходники и патч к реестру можно найти по ссылке: Я.Диск.
Комментарии (75)
Vasia529
14.07.2016 11:46+3Recaps же
kolemik
14.07.2016 12:47-1g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelHookProc, GetModuleHandle(NULL), 0);
ну то есть совсем другой подход, чем я предлагаю. Через хуки-то любой сможет ;)
EJIEKTPOMEX
14.07.2016 15:04Увы, Recaps не работает на Win10 (возможно и 8 — не проверял) в Modern приложениях.
Vasia529
14.07.2016 21:03да, увы. возможно необходимо использовать какое-то другое апи для перехвата нажатий в метро-приложениях? в 8ке и 8.1 тоже не работал, да
anrodkin
14.07.2016 11:55Попробуйте посмотреть в сторону Capslang (http://flydom.ru/capslang/). Сам пользуюсь версией caps-min.exe на Win 7 больше полугода. Пока недочетов не выявил
kolemik
14.07.2016 11:55Недостатки:
Не переключает раскладку в некоторых программах
собственна вот…anrodkin
14.07.2016 12:09Я потому и написал, что «недочетов не выявил». За полгода не встретился с таким приложением, в котором были бы проблемы с переключением раскладки. Пользуюсь офисным пакетом от Microsoft, Visual Studio 2013 + дополнительные инструменты для C#/JavaScript/SQL, различные мессенджеры и тулы для конференц связи и т.п. Но всё зависит от используемых приложений.
Самого же в первую очередь привлёк очень маленький размер (5 КБ)DmitryMry
15.07.2016 10:08Например, в Excel (офис 2010), при нажатии на стрелки, происходило перемещение области видимости, вместо перемещения курсора (при включенной кириллице). Невозможно переключить раскладку через CapsLock в системных диалоговых окнах (сохранение файла, например) — приходилось переключать мышкой в панели. Были и ещё какие-то проблемы, сейчас уже и не помню всё. Ну и хотелось одной глобальной раскладки на все приложения, а так получалось много «весёлостей», вплоть до изменения языка в скайпе при удалении символа, либо при перемещении курсора (и это не разовые проблемы, оно могло происходить десятки раз за очень короткое время). И про все эти проблемы забыл после того, как перешёл на раскладку из поста, упомянутого ниже.
Zagrebelion
15.07.2016 05:45Тут скорее недостаток другой: если зайти пор RDP на компьютер, где тоже запущен caps-min.exe, и в начальный момент времени включены разные раскладки, то реакция на Caps Lock будет неоднозначна: иногда переключается раскладка на локальном компе, но не удалённом; иногда — наоборот, а иногда вообще ничего не происходит.
Рецепт — мышкой выбрать на обоих хостах одну и туже раскладку.
serafims
14.07.2016 11:56Для тех, у кого стоит Punto Switcher — там эта функция есть в настройках переключения. Работает вроде корректно…
Блин! Даже прочитав комментарии, не успеешь не написать одинаковый…kolemik
14.07.2016 11:58я в курсе. пользовался именно этой фичей. но вот у нас в конторе пунто == харам.
DmitryMironov
14.07.2016 12:27+1AutoHotKey (https://autohotkey.com/) — кроме этого можно настраивать практически все что угодано через собственные скрипты.
timetogo
14.07.2016 13:46Ну и, собственно, готовое решение, к которому пришёл через кучу проб и ошибок. Дело в том, что много других решений рано или поздно срабатывали не так, как надо, только текущее решение всегда работает безупречно. Первым делом я переназначил CapsLock на другую клавишу, например, RAlt или F13, это можно легко сделать через SharpKeys. Теперь сам код AHK (для RAlt):
RAlt::
if (Key="1")
return
else
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}
return
RAlt & WheelDown::
Send {Volume_Down}
return
anser
14.07.2016 16:08+1у меня так работает.
CapsLock::Send, {Alt Down}{Shift}{Alt up}
CapsLock включается через Shift+CapsLock.
Goodkat
14.07.2016 16:24Иногда почему-то CapsLock срабатывает как CapsLock, и потом приходится отключать AHK, чтобы отключить режим CapsLock.
А буква Ё во встроенной в Windows раскладке TypeWriter справа снизу, левее правого шифта — пользуюсь этой раскладкой уже лет десять, оказалась намного удобнее дефолтной, так как кроме удобного положения буквы Ё ещё и точка и запятая находятся на разных клавишах и вызываются без шифта.
lightman
14.07.2016 20:44Уже больше года пользуюсь таким AHK скриптом
1. Alt+Caps включает стандартную функцию капслока
2. Caps переключает на английский
3. Правый Alt — на русский
!Capslock::Capslock Capslock::f(0x4090409) ; включение английского RAlt::f(0x4190419) ; включение русского f(p) { ControlGetFocus, sCN, % "A" PostMessage, 0x50,, p, % sCN, % "A" }
Для себя я пришёл к выводу, что циклическое переключение (не важно по какой клавише) всё равно неудобно — надо либо помнить последнюю раскладку, либо постоянно переводить взгляд в угол экрана. Гораздо удобнее нажать и сразу же начинать писать.
Работает отлично, но, увы, не всегда, в некоторых модальных окнах приходится переключаться по оставленной для совместимости комбинацией Alt+Shift.timetogo
14.07.2016 21:29Кажется пробовал похожее на ваше решение, в том-то и дело, что иногда не срабатывало, жутко бесило. А насчет циклического переключения — есть смысл освоить слепой набор, сразу будете видеть, что набираете, заодно вырастет скорость набора и глаза меньше уставать будут.
lightman
15.07.2016 07:23А насчет циклического переключения — есть смысл освоить слепой набор
Дык владею им родимым, владею, но всё равно пока успеваю осознать что пишу не в той раскладке – успеваю вбить целое слово или даже два. Затем остановка, BS-BS-BS...BS, <переключение>, <проверка_что_переключение_успешно> снова пишем. На фоне моей скорости печати вот эти действия от отмене забирают довольно много времени и мыслительных сил.
findoff
14.07.2016 12:28Еще лет 7 назад сделал в MLC раскладку "Английский — Русский". А потом и девушка перешла. (Правда она капс всё время не выключает, что меня привычного к всегда Английскому немного сбивает.)
Punto switcher не люблю, так как в свое время нахватался с ним очень много глюков. (Справедливости ради в некоторых играх есть проблемы что с PS, что с раскладкой, но последние время такое всё реже)
alkoro
14.07.2016 15:03Если кому интересно, ещё один способ переключения по CapsLock — мне понравился тем, что переключатель глобальный для всех приложений, недавняя публикация habrahabr.ru/post/301882
DmitryMry
15.07.2016 09:55Как раз на этот способ перешёл с Capslang. Единственная проблема, с которой столкнулся — в Xamarin Studio 5 вместо переключения раскладки происходит переключение регистра (как понимаю, следствие каких-то собственных особенных методов работы с клавиатурой XS, из-за чего также уже много лет не могут также починить баг с буфером обмена на Windows). Во всех остальных местах, где с Capslang были проблемы, всё стало работать нормально.
serega6531
14.07.2016 15:04+1Костыли какие-то. Я просто в автозагрузку lswitch.exe 20 (гуглится) поставил и радуюсь. А пунто ещё и забывает переключать иногда, и тогда капс залипает во включенном состоянии.
AlexPancho
14.07.2016 17:06Спасибо, действительно крохотулька меньше 5 Кб, и прекрасно работает.
Думаю, не грех дать ссылку на сайт с утилитой:
https://haali.su/winutils/
Use any key to switch input languages, usage: lswitch [keycode]. Keycode is optional and defaults to context menu key. Another good candidate is a CapsLock key with a keycode of 20.
saboteur_kiev
14.07.2016 16:34+3А может меня кто-то просветить, чем не устраивает обычный Ctrl+Shift?
Или я не понял о чем идет речь, но никаких проблем с Putty, никаких проблем с виртуальными машинами, никаких проблем с удаленными машинами по rdp/citrix/etc…
AlexPancho
14.07.2016 16:50-1тем, что при работе с несколькими виндами надо гадать: где-то альт+шифт, где то — кантрол+шифт, а если раскладок не две а три… Это отдельная, непонятная печатающим только на ру/англ боль. Ибо где-то может быть ру-укр-анг, а где то ру-анг-укр…
saboteur_kiev
14.07.2016 17:26+1А это тут причем? Или CAPS автоматом вдруг настраивается на всех виндах сам?
Ctrl+Shift и одинаковые раскладки настраиваешь на всех своих виндах и все.uel
14.07.2016 19:30+1Тоже не понимаю зачем все это. Тем более привыкнешь к нестандартной, потом сел за другой комп — напряг. Я своих юзеров всех на Alt+Shift пересадил, и не важно какая винда, сколько языков.
burjui
15.07.2016 02:34Кому как. Меня не то что бы не устраивает, просто Caps Lock устраивает больше, т.к. это одна клавиша вместо двух, и ей соответствует светодиодный индикатор, видимый периферическим зрением (важно для моего "полуслепого" набора). К тому же, её обычная функция для меня бесполезна.
DmitryMry
15.07.2016 10:16Тем, что иногда, по разным причинам (буква нажата не до момента срабатывания, в последний момент передумали и т.п.), при нажатии горячих клавиш (ctrl+shift+...) получается случайная смена языка ввода.
bull1251
19.11.2016 17:18И они действительно рассматривают лишь подмножество точек (сигнальных фотонов), поскольку лишь подмножество может (в результате определенных манипуляций) дать интеренференционную картину
По какой причине рассматриваемое подмножество точек может дать интеренференционную картину? Значит для данного подмножества фотоны должны быть когерентны. Но могут ли фотоны из одного подмножества быть когерентными, а из другого подмножества быть не когерентными? Такого в принципе быть не должно.
и мы узнаем об этом только после изучения холостых фотонов. Вы же утверждаете что можно получить интерференцию всех сигнальных фотонов, в завистмости от будущих действий с холостыми.
Посмотрите в предыдущем комментарии рисунок (б). Что нам мешает в место даун-конверторов А и Б поставить зеркала под углом 45°, тем самым исключив из эксперимента детекторы 1 и 4? В этом случае все холостые фотоны будут направлены в даун-конвертер С, стирающий информации о выборе пути. Значит все сигнальные фотоны сохранят квантовую неопределенность и будут формировать на экране интеренференционную картину.
punkkk
14.07.2016 18:09Задам, вероятно, глупый вопрос — если капслок, то без вечноверхнего регистра(с трудом помню, что бы я это использовал, но всё же)? Просто сам давно ищу что-нибудь на замену ctrl+Shift, в kde вечно проблемы с этим были, перешел на alt+shift, появились проблемы в win.
grmood
15.07.2016 00:35А кто-то вообще сейчас использует Caps Lock «по назначению»? Я им не пользуюсь уже очень давно. Только бывает мешает, когда случайно нажму на него. Идея использования его для переключения раскладки кажется мне отличной.
punkkk
15.07.2016 09:50До этой статьи я как-то не задумывался на тему его использования, действительно только мешает.
Kondra007
14.07.2016 18:09Давным-давно сделал свой костыль LangSwitch bitbucket.org/master_groosha/langswitch/src
Из особенностей: сделано на Autohotkey, поддерживаются все варианты переключения (эмулируется тот, который установлен в системе, т.е. Ctrl+Shift, Alt+Shift, Grave Accent и т.д. Инфа берется из реестра).
Иконки в трее и возможность временно приостановить скрипт.
bodqhrohro
14.07.2016 18:17получать удвоенное удовольствие от слепой десятипальцевой печати
Клавиш для ввода аббревиатур является неотъёмлемой частью слепого десятипальцевого метода набора. Прыжки по Shift'ам, замедляющие набор — ересь. А переключение раскладок, раз уж оно айтишникам так часто необходимо, можно повесить на однократное нажатие какого-нибудь модификатора. Например, одного из Alt/Option, которые находятся под малозагруженными большими пальцами и значительно не «гуляют» на разных клавиатурах.Merlyel
14.07.2016 19:42Alt'ом много где вызывается меню, так что не вариант. Вводить заглавные аббревиатуры лично мне приходится крайне редко, и на этот случай можно как раз включить CAPS другим сочетанием (на Linux, например, у меня для этого используется Shift+CAPS). Хотя я, кажется, набираю их все равно с Shift'ом
AndreyDmitriev
14.07.2016 20:33Я пробовал несколько решений, назначающих Caps Lock на переключение языка, и все в конечном итоге приводили к тому, что в какой-то момент рано или поздно я обнаруживал, что всё пишется в залипшем Caps Lock, который вот так вот запросто не отключить, так как на нём висит другая функция. В общем перестал трогать Caps Lock и остался на Ctrl+Shift.
timetogo
14.07.2016 21:32Для этого капслок сначала переназначается на другую клавишу, например, F13, а к ней уже прикручиваются нужные скрипты.
Diaskhan
15.07.2016 00:35Зачем велосипед, если есть F1-F12 ??? Так же есть редко используемые Scroll lock и атавизм Pause break ??
locutus
15.07.2016 01:26Долго работал с CapsLock, но когда начал учить испанский, понял, что циклическое переключение раскладок — это зло. В итоге для английского стоит Ctrl+1, для испанского Ctrl+2, для русского Ctrl+3. И никакой путаницы никогда.
Настроить эти же хоткеи под убунтой оказалось нетривиальной задачей в сравнении с Windows, но и там в итоге все заработало.
orcy
15.07.2016 14:05Мне нравится вариант раскладки когда LShift — английский, RShift — русский. Переключение срабатывает только если нажать и отпустить shift без какой-либо другой кнопки, что в обычном состоянии не имеет какого-либо эффекта. Хорошо тем что не надо знать текущую раскладку когда хочешь что-то набрать: нажимаешь нужный шифт и вперед. Есть программы которые это позволяют настроить такую раскладку (https://github.com/razaraz/keyla например), однако не всегда все гладко работает к сожалению.
ruizAw
15.07.2016 18:15LCtrl — английский, RControl — русский, Caps — украинский (ну вот тут по кругу, просто украинский — не получается, а жаль) в Пунто. Авто — офф. Вроде все работает.
GoogleRU
Способ для ламеров — усановить PuntoSwitcher. А вдруг кому-то понадобится за вашим ПК поработать? В PS хоть быстро вернуть можно, а в Вашм варианте — кроме Вас никто знать не будет как обратно вернуться.
kolemik
да, пунто срабатывает. именно поэтому раньше у меня не возникало такой проблемы. Но на новом месте работы пунто под запретом, увы.
kolemik
По-поводу изменений в реестр — да, увы, это затрагивает всех пользователей (хотя я не проверял). Но я и не претендую на универсальность — просто ещё один способ решения проблемы плюс собрал вместе полезную информацию.
lasalas
А что за место? (ненароком бы не вляпаться)
destroy
Присоединяюсь к вопросу
Ambyte
Попробуйте everylang, программа имеет подобный функционал что и в Punto Switcher, плюс дополнительные плюшки.
warlock13
Ну, для тех, кто считает, что единственно правильный способ переключения раскладок существует и способ этот — CapsLock, это даже плюс. А вообще в новых виндах есть способ универсальный и работающий на всех чужих компах — Win+Space.
P. S. Единственным более (или хотя бы не менее) правильным способом, чем CapsLock, я готов признать использование немодальных переключателей. К сожалению, других (кроме CapsLock) бесполезных клавиш на клавиатуре нет.
acmnu
Можно ещё клавишу контекстного меню использовать — ей редко пользуются по назначению. Я правда не знаю возможно ли это в Windows, но если влезть в скан коды, как в статье, то врятли возникнут проблемы.
Кроме того есть совет актуальный для владельцев MS Nature 4k. В комплекте с клавиатурой шла утилитка, которая позволяла переопределять клавиши. Правда это было 9 лет назад, как сейчас дела я не знаю.
bodqhrohro
Если система настолько загружена, что курсор мыши еле ползёт с интервалом в полминуты, или рабочего указательного устройства вообще нету — Menu весьма и весьма полезен.
qw1
Эта кнопка почти всегда доступна по Shift+F10
hdfan2
Тоже пользуюсь Punto (для переключения по CapsLock и быстрого исправления неправильно набранного текста), но достаёт, что он иногда переходит в режим CapsLock, а как его вернуть назад, я так и не нашёл. Пробовал включать настройку «Использовать ScrollLock вместо CapsLock», но в результате ScrollLock тоже переключает раскладку. Может, подскажет кто, как в этом случае переключить CapsLock?
acmnu
Возможно Shift+CapsLock?
hdfan2
Если бы. Просто переключает язык. Я уже всё перепробовал. Спасает только закрытие ПС, переключение по-старому и снова запуск.
warlock13
Я написал простейшую программку на C# :) (ну т. е. что было под рукой — на том и написал). (Хотя я пользовался способом, описанным в статье, а не пунто, но при работе с виртуалками иногда неожиданно оказывается включён капс, а замапить скроллок, как сделал автор, я не догадался.)
FeNUMe
Capslang миниатюрная тулза решающая задачу из статьи. Юзать пунто и аналоги только для переключения раскладки по капсу это оверкилл.
Что интересно у меня версия Capslang от 2011 года прекрасно работает в вин10, хоть на сайте автор пишет что работать не должна.