Про переключение раскладок клавиатуры написано очень много, на хабре в том числе. Когда, год или два назад, я понял, что привычный Ctrl+Shift меня не устраивает, я, конечно, не стал изобретать велосипед, а начал искать, что по этому поводу уже придумано. И временно утонул в океане идей и мнений.
У меня было две причины искать лучшего. Во-первых, прекрасные люди из числа производителей ноутбуков придумали на привычное место клавиши Ctrl помещать Fn (иногда это можно пофиксить в биосе). При нормальном расположении клавиш комбинация Ctrl+Shift набирается не глядя, а после усовершенствований все везде стало по-разному. Во-вторых, понадобились дополнительные раскладки. А циклическое переключение для трех и более раскладок — это беда, об автоматизме можно забыть.
Перепробовал массу вариантов, начиная с Punto. Все чем-то не устраивали. В конце концов, собрал собственный велосипед на основе скрипта AutoHotKey, которым и пользуюсь. Публикую в порядке обмена опытом, не претендуя на какую-либо новизну.
Две основные раскладки включаются детерминированно, английский — CapsLock, русский — Shift+CapsLock. Остальные установленные раскладки подключаются циклически, учитывая их редкое использование. Не буду ничего говорить про плюсы и минусы, удобство переключения раскладок — дело очень индивидуальное.
Итак, приступим.
Шаг 1. Бесполезную клавишу CapsLock преображаем в правый Ctrl (RCtrl). Почему в него? Потому что безобидная клавиша, редко используется, никому не мешает. [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlKeyboard Layout]
Windows Registry Editor Version 5.00
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,e0,3a,00,00,00,00,00
После импорта reg-файла требуется перезагрузка.
Шаг 2. Ставим AutoHotKey
Шаг 3. Пишем скрипт (назовем его, к примеру, keyboardLayout.ahk). Этим вариантом пользуюсь сейчас:
en := DllCall("LoadKeyboardLayout", "Str", "00000409", "Int", 1)
ru := DllCall("LoadKeyboardLayout", "Str", "00000419", "Int", 1)
~<+RControl::SetLayout(ru)
~>^LShift::SetLayout(ru)
~RControl::SetLayout(en)
#Space::ChangeLayout()
!Space::ChangeLayout()
SetLayout(language)
{
ControlGetFocus, control, A
PostMessage 0x50, 0, %language%, %control%, A ; WM_INPUTLANGCHANGEREQUEST
}
ChangeLayout()
{
PostMessage 0x50, 2,,, A ; WM_INPUTLANGCHANGEREQUEST
}
Скрипт, или ссылку на него, подкладываем в автозагрузку.
Все, можно пользоваться (чтобы не перегружаться еще раз, можно кликнуть по скрипту двойным кликом — AHK его загрузит).
Английский в данном случае подключается по CapsLock или RCtrl, теперь все равно. Русский по Ctrl+Shift и Shift+Ctrl. Циклическое переключение всех установленных в системе языков (не исключая русский с английским) — по Alt+Space или Win+Space. Можно было оставить штатное виндовое циклическое переключение, но с Ctrl — описанная выше ноутбучная проблема, а по Alt+Shift мне вслепую попадать удавалось в лучшем случае через раз.
P.S. В качестве последней попытки использовать штатный переключатель раскладок Windows было: Ctrl+1 — английский, Ctrl+2 — русский (остальное в цикле стандартной комбинацией). Неудобно. Вслепую не попадаю.
Потом довольно долго использовал keyla. Все устраивало, только под Win7-64bit работает нестабильно. Так что пока пользуюсь самоделкой.
Автор: msyu