Тема: AHK: При переключении раскладки клавиатуры пропустить ненужную
Доброго времени суток.
Возникла такая задача. В Windows 10 добавил язык Italiano к имеющимся Русский и English. Теперь имею 3 раскладки клавиатуры, в том числе итальянскую. А она мне не нужна, нужен только языковой пакет для синтеза итальянской речи. Убрать третью раскладу без удаления всего языкового пакета не удалость (в MS подтвердили, что это невозможно).
Решил попытаться сделать с помощью AHK так, чтобы при переключении РУС-ENG-ITA-РУС... раскладка перескакивала с ENG на РУС, минуя ITA. Получилась программка (см. ниже), но она работает нестабильно. Эксперты, что посоветуете?
;---пытаюсь пропустить итальянскую раскладку клавиатуры
~LCtrl & LShift:: ;Ctrl+Shift - так у меня переключаются раскладки клавиатуры
Lang := Lang_In_Window() ;вызываем функцию определения языка раскладки активного окна — см. ниже
; 0x4190419 — русская раскладка, 0x4090409 — английская раскладка, 0x4100410 — итальянская раскладка
If (Lang= "0x4090409") ; если была английская раскладка, то следующая итальянская раскладка, ее нужно пропустить, и сразу переключиться на русскую
{
Send, !+1 ; Alt+Shift + 1 - Переключение раскладки клавиатуры на русский язык (у меня назначено такое сочетание)
}
Return
Lang_In_Window()
{
;27.11.10 Выясняем язык раскладки активного окна
;http://www.script-coding.com/AutoHotkey/AhkRussian.html
;Вызвать функцию можно так: Lang := Lang_In_Window()
; 0x4190419 — русская раскладка, 0x4090409 — английская раскладка, 0x4100410 — итальянская раскладка
; запоминаем текущий режим определения/нет скрытых окон
DetectHiddenWindows_Before := A_DetectHiddenWindows
DetectHiddenWindows, On ; переключаемся на работу со скрытыми окнами
; запоминаем текущий режим поиска окон по заголовкам
TitleMatchMode_Before := A_TitleMatchMode
; переключаемся на режим "искать в любой части заголовка окна"
SetTitleMatchMode, 2
FormatInteger_Before := A_FormatInteger ; запоминаем текущий числовой формат
SetFormat, integer, H ; переключаемся на шестнадцатеричный формат
WinGet, Active_Window_ID, ID, A ; получаем ID активного окна
Active_Window_Thread := DllCall("GetWindowThreadProcessId"
, "UInt", Active_Window_ID, "UInt", 0)
; получаем для активного окна ID его потока через Win API
Lang := DllCall("GetKeyboardLayout", "UInt", Active_Window_Thread) ; получаем текущую раскладку для найденного потока активного окна через Win API
;MsgBox Lang: %Lang%
; 0x4190419 — русская раскладка, 0x4090409 — английская раскладка, 0x4100410 — итальянская раскладка
; возвращаем режим определения/нет скрытых окон
DetectHiddenWindows, %DetectHiddenWindows_Before%
; возвращаем режим поиска окон по заголовкам
SetTitleMatchMode, %TitleMatchMode_Before%
; возвращаем числовой формат
SetFormat, integer, %FormatInteger_Before%
return Lang ;задаем значение функции
} ; конец функции