На дворе 2022 год, и, казалось бы, всё, что касается такой воспомогательной функции, как переключение языков ввода, уже должно быть давным-давно написано… Но, нет предела стремлению к совершенству. Началось с мелочи: у меня в системе установлены три языка – русский, английский и китайский. Переключались они всегда в цикле по сочетанию Alt+Shift и нужны были все три постоянно. Всё было хорошо, пока в какой-то момент (примерно полгода назад), китайский не “выпал” – стал требоваться редко и начал мешать при переключении Ru-En. А отключать его насовсем в мои планы не входило…
И тому была причина: “китаизация” ввода под Windows – это вообще отдельная история и отдельный мир. В этом мире по-прежнему используются разные программы а-ля “русификаторы”, точно, как у нас было когда-то. Встроенный в систему китайский ввод настолько плох, что им не пользуется никто, все сразу ставят свою программу. А поскольку встроенным вводом никто не пользуется, он и не эволюционирует – существует чисто для галочки, а не для практического применения… Вот. И я установил себе прекрасный (на мой взгляд) Thunisoft Huayu Pinyin и ломать настроенное совсем не хотелось.
А хотелось совсем немного: чтобы по привычному мне сочетанию Alt+Shift переключались русский и английский, а китайский, оставаясь в системе, пропускался и включался отдельной кнопочкой. Вроде, ничего сверхъестественного я не желал, правда? Однако, оказалось, что средствами Windows такое настроить нельзя. Можно на каждый язык сделать отдельную кнопку, а вот циклическое переключение будет перебирать их все… Да, в "десятке" это точно так же, как и во всех предыдущих версиях. Ну, ладно, нет так нет, думаю – найду сторонний переключатель. И не нашел. Всевозможные свитчеры предлагали что угодно, но только не нужную мне функцию. Это было настолько неожиданно, ведь задача кажется такой простой, очевидной и востребованной. Лично знаком с человеком, у которого шесть языков установлено, он их переключает мышкой в панели задач...
Ни сходу, ни специально засев в интернете для поиска, готового решения найти не смог. В сети находились только вопросы, о том, как сделать такое переключение, с пропуском какого-то языка. Ответов было не слишком много, но кое-какие всё же были. Самым подходящим мне показался совет написать скрипт на AutoHotkey. Это довольно известная и мощная программа со встроенным скриптовым языком для создания различных макрокоманд . Более того, скрипт можно скомпилировать в exe-файл и далее он будет жить уже самостоятельно, без AutoHotkey в системе. Мой скрипт перехватывает нажатие Alt+Shift и эмулирует нажатие сочетаний Ctrl+9 и Ctrl+0, к которым я привязал русский и английский, соответственно. Исходный код скрипта:
ru := DllCall("LoadKeyboardLayout", "Str", "00000419", "Int", 1)
SwitchLang()
{
global ru
w := DllCall("GetForegroundWindow")
pid := DllCall("GetWindowThreadProcessId", "UInt", w, "Ptr", 0)
l := DllCall("GetKeyboardLayout", "UInt", pid)
if (l = ru)
{
Send {LCtrl Down}{0 Down}{0 Up}{LCtrl Up}
}
else
{
Send {LCtrl Down}{9 Down}{9 Up}{LCtrl Up}
}
}
!~LShift UP::
{
if GetKeyState("Alt")
{
SwitchLang()
}
Exit
}
~LAlt UP::
{
if GetKeyState("Shift")
{
SwitchLang()
}
Exit
}
Своей цели я добился, но, всё же, полоноценным это решение назвать было нельзя. Оно больше походит на заплатку или "взлом системы" исключительно под мою задачу. И так же оно не работает в консольном окне. Так что, поиск продолжился.
Через некоторое время, где-то в обсуждениях встретил упоминание о программе ReCaps. В этой программе наконец-то нашлась нужная функция – можно было настроить циклическое переключение избранных языков, но, правда, только на клавишу CapsLock. Конечно, хотелось бы сохранить привычное сочетание Alt+Shift… Написал автору письмо с вопросом, можно ли так сделать? Автор программы, Siaržuk Žarski, ответил и прислал тестовую версию, где сочетание клавиш уже можно было менять. Программа понравилась, с удовольствием принял участие в beta-тестировании. В конце декабря вышел релиз, ReCaps v.0.9.0.3480. Обновил исходную бету до текущей версии и продолжил пользоваться. В ней так же нет поддержки переключения языка в консоли, но зато, это уже полнофункциональный менеджер языков ввода с возможностью собирать их в группы и настраивать циклическое переключение для каждой группы отдельно. Для изменения настроек не требуется программирование, можно просто дать человеку-не программисту ссылку на программу и сказать: "Установи вот это и настрой переключение как тебе удобно"
Вот такие два способа, как управлять переключением языков, если их в системе больше двух, мне удалось найти. Надеюсь, кому-то это окажется полезным.