Итак, объясняю, как под виндой поймать переключение языка ввода любого (в том числе и консольного) окна.
Ставится глобальный хук на события 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+'» даёт «á» (если включен режим «Диакритика», см. меню в трее).
В целом, всё сделано так, как удобно лично мне, если кому-то что-то не нравится — исходники открыты.
Ставится глобальный хук на события 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+'» даёт «á» (если включен режим «Диакритика», см. меню в трее).
В целом, всё сделано так, как удобно лично мне, если кому-то что-то не нравится — исходники открыты.