17/09/2016

yury_finkel: (манул)
Итак, объясняю, как под виндой поймать переключение языка ввода любого (в том числе и консольного) окна.

Ставится глобальный хук на события WH_SHELL (а раз он глобальный, то это необходимо делать в dll). Когда код события равен HSHELL_LANGUAGE, это значит, произошло переключение языка в окне, при этом в lParam содержится код языка (а в wParam — дескриптор окна, но он нам не нужен). Чтобы передать эту информацию нашему приложению (напомню, что переключение языка происходит в другом приложении, поэтому никакие глобальные переменные не помогут), можно просто послать широковещательное сообщение с wParam и lParam в качестве параметров, а наше приложение должно будет поймать это сообщение и предпринять необходимые действия (например, отобразить флаг, соответствующий языку, в трее).

Привожу полностью код dll на Delphi (компилируется также Lazarus'ом). Можно и на C написать, но мне удобнее так.

hooksh.dpr )

В скрипте на AutoHotKey это событие можно обработать, например, так (в начале идёт инициализация dll):

фрагмент cxswitch.ahk )

Полностью исходный код моей самопальной переключалки клавиатуры можно скачать здесь, а работающие скомпилированные бинарники (для 32- и 64-разрядной винды) — здесь. Переключалка клавиатуры работает не по циклическому принципу, а по принципу «одна клавиша — один язык». У меня, например, на левый Shift назначен английский, а на правый — русский. (Кстати, срабатывает только короткое нажатие — я специально так сделал во избежание ошибочных нажатий). Флаги языков и звуки переключения можно добавлять самому, просто назвав соответствующие файлы по коду языка (например, enu.ico, enu.wav и rus.ico, rus.wav). Настройки — в файле cxswitch.ini. Кроме того, в переключалку встроен ввод эсперантских букв с диакритиками (включается и выключается по Alt+Ctrl+Space), ввод кавычек-лапок по RAlt+< / RAlt+> и длинного тире по RAlt+-, а также ввод некоторых европейских диакритик, например, «a RAlt+'» даёт «á» (если включен режим «Диакритика», см. меню в трее).

В целом, всё сделано так, как удобно лично мне, если кому-то что-то не нравится — исходники открыты.