Два способа управления языками ввода под Windows

На дворе 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. Обновил исходную бету до текущей версии и продолжил пользоваться. В ней так же нет поддержки переключения языка в консоли, но зато, это уже полнофункциональный менеджер языков ввода с возможностью собирать их в группы и настраивать циклическое переключение для каждой группы отдельно. Для изменения настроек не требуется программирование, можно просто дать человеку-не программисту ссылку на программу и сказать: «Установи вот это и настрой переключение как тебе удобно»

Окно настроек ReCaps. Русский и английский включены, китайский пропускается.Окно настроек ReCaps. Русский и английский включены, китайский пропускается.


Вот такие два способа, как управлять переключением языков, если их в системе больше двух, мне удалось найти. Надеюсь, кому-то это окажется полезным.

© Habrahabr.ru