1

Тема: AHK: переключение раскладок клавиатуры по произвольным клавишам

Хочу предложить еще один удобный с моей точки зрения метод переключения раскладок.
Главная мысль, что переключать раскладки нужно одной клавишей, но эта клавиша должна быть разная для разных раскладок!
Внимательно изучив свою клавиатуру :-) нашел две идеально подходящие для этого клавиши!
Это "Правая Win" и "Правая меню". Клавиши удобно расположены рядом и никогда мною не используются.

Коды я взял из одноименной темы в разделе AutoHotkey и соответственно модифицировал.

kbd_msg(text)
{
    no_detect_window := -1
    ToolTip, %text%, A_CaretX + 10, A_CaretY - 20
    SetTimer, KbdRemoveToolTip, -1000
    return
    
    KbdRemoveToolTip:
    ToolTip
    no_detect_window := 1
    return
}

AppsKey::
    PostMessage, 0x50, 0, 0x4190419,, A     
    kbd_msg("RU")   
Return

RWin::
    PostMessage, 0x50, 0, 0x4090409,, A
    kbd_msg("EN")    
Return

И еще хочу попросить помощь зала в таком вопросе.
Русская раскладка у меня не стандартная, а модифицированная с помощью Microsoft Keyboard Layout Creator, там добавлены украинские символы через AltGr.
Так вот, при переключении с помощью скрипта, включается не эта раскладка, а стандартная Русская, хотя в системе установлена только одна - модифицированная.

Помогите добить идею!

2

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

В теме AutoHotkey: переключение раскладок клавиатуры по произвольным клавишам есть скрипты для определения установленной у Вас раскладки (вместо «0x4190419»).

3

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

alexii пишет:

В теме AutoHotkey: переключение раскладок клавиатуры по произвольным клавишам есть скрипты для определения установленной у Вас раскладки (вместо «0x4190419»).

Я там внимательно все изучил, когда свой вариант делал.
Дело в том, что первая функция возвращает 0xF0C00419 ( а если убрать последний операнд, то -0xF3FFBE7), а второй вариант просто -0xF3FFBE7. Это тогда когда вручную включена моя модифицированная раскладка. Раскладка в этот момент работает.
Но вызов команды
PostMessage, 0x50, 0, 0xполученный_код,, A
просто не меняет текущую раскладку.

Где-то нестыковка.

Могу для полноты картины сообщить что у меня Win7 x64 и AutoHotkey_L x64

4

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Для настоящей полноты желательно пощупать проблему вживую. Можете где-нибудь выложить свою раскладку, вместе с инструкцией, как её установить?

5

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Alpha, я как раз так и делал. У меня была так же установлена своя раскладка, сделанная (в то время) с помощью «Microsoft Keyboard Layout Creator 1.3.4073». И было отличное от «0x4190419» значение. Я поменял в скрипте переключения раскладок «0x4190419» на своё, и скрипт заработал. Какое значение возвращалось, и как я его подставлял — уже не скажу, не помню.

YMP, раскладка представляет собой *.msi пакет с единственной библиотекой *.dll внутри. Устанавливается обычным образом, можно даже в параллель с обычной русской раскладкой. Для удаления установленной раскладки — данная раскладка не должна быть текущей/умолчальной). Насколько помню, у меня не требовалась даже перезагрузка для сих действий (под XP).

6 (изменено: Alpha, 2011-01-10 00:25:16)

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Вобщем ситуация такая.
Я долго еще пытался получить "правильный код", даже ковырялся в самой dllке, выковыривая оттуда все что похоже на 419.
Изучал интернет на тему GetKeyboardLayout.
А в один прекрасный момент все заработало с самым начальным кодом 0x4190419
Возможно перезагрузка помогла?
И что интересно, обе процедуры получения кода все равно показывают другие значения.
BTW, 0x0C00 это Default custom locale language, а GetKeyboardLayout выдавал мне похожее значение 0xF0C00, но я пробовал все эти варианты - не помогало.

Так что будем считать, что все работает.

Если кому-то все-же интересна моя кастомизированная раскладка - могу выложить. Но там ничего интересного.
Взял стандартную русскую, и добавил в "слой" AltGr украинские буквы на тех местах где они должны быть, плюс апостроф на ё и еще заменил № на $, это лично моя прихоть уже.

7

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Потестил код из первого окна. Вместо RWin поставил привычный мне Rctrl и Lctrl, конечно c тильдами впереди.
  Работает отлично, за исключением одной ситуации. Если была включена русская раскладка, то вместо выделения текста Ctrl+A просто напишет "a". И так со всеми остальными стандартными комбинациями.
  Можно как-то этого избежать?

8

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Конечно. AutoHotkey: Начинающему разработчику - Печатаю виртуальными кодами

9

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Вроде бы сработало. Но даже представить себе не могу как замена LCtrl на vkA2 могла на это повлиять? Модификаторы вроде же не зависят от раскладки?

10

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Нет, я имел в виду замену буквы "а" на код. А Ctrl в любой раскладке одинаково называется.

11

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Я про "а" не в скрипте, а в обычном использовании при физических нажатиях на клавиши. Также было и с "v" и т.д. А теперь когда я заменил Ctrl на сканкод стало работать нормально. Что за тайная магия?

12

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Понятно. Не знаю, что за приколы. Я переключаю тоже Ctrl'ом, правда общим, а не отдельно левым и правым, и таких глюков не наблюдаю. Кстати, советую вам усовершенствовать код, чтобы переключение посылалось в контрол окна, который в фокусе. Иначе переключение не работает в некоторых диалоговых окнах.


Ctrl::
    WinExist("A")
    ControlGetFocus, CtrlFocus
    PostMessage, 0x50, 0, 0x4190419, %CtrlFocus%
Return

13

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Да, так лучше.

14

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Хорошо бы ещё ввести отмену переключения раскладки, если кроме клавиши переключения до её отпускания, была нажата ещё какая-то клавиша. Чтобы использование клавиш модификаторов в традиционных целях не переключало раскладку.

15

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

С общим Ctrl'ом так всё и работает. Для разных попробуйте это:


~RCtrl Up::
    If (A_PriorKey = "RControl") {
        WinExist("A")
        ControlGetFocus, CtrlFocus
        PostMessage, 0x50, 0, 0x4190419, %CtrlFocus%
    }
Return

~LCtrl Up::
    If (A_PriorKey = "LControl") {
        WinExist("A")
        ControlGetFocus, CtrlFocus
        PostMessage, 0x50, 0, 0x4090409, %CtrlFocus%
    }
Return

16

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Отлично работает, спасибо!  Думаю, что можно в постоянные добавить. А в сочетании с http://forum.script-coding.com/viewtopic.php?id=7186 будет вообще отличная замена punto.

17

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

И ещё не всё. Мышь как-то можно учесть?  Иначе, например при открытии закладок в новом окне в броузере "Ctrl" + левый клик мыши всё равно происходит переключение.

18

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Как вариант:


~RCtrl Up::
    If (A_PriorKey = "RControl" && !Mouse) {
        WinExist("A")
        ControlGetFocus, CtrlFocus
        PostMessage, 0x50, 0, 0x4190419, %CtrlFocus%
    }
    Mouse := 0
Return

~LCtrl Up::
    If (A_PriorKey = "LControl" && !Mouse) {
        WinExist("A")
        ControlGetFocus, CtrlFocus
        PostMessage, 0x50, 0, 0x4090409, %CtrlFocus%
    }
    Mouse := 0
Return

~^LButton:: Mouse := 1

19 (изменено: Dimox, 2014-08-04 13:55:12)

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Подскажите, пожалуйста. Мне нужно то же самое, только вместо Ctrl хочу использовать Shift. В скрипте из поста №18 достаточно поменять RCtrl и LCtrl на RShift и LShift? Или еще нужно что-то поставить вместо RControl и LControl?

20

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Да, их тоже заменить на соответствующие шифты.

21

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Большое спасибо!

22

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

переключение раскладки с основной на дополнительному по двойному нажатию на левый CTRL


вот давно хотел сделать переключение по двойному нажатию на контрол или еще как-то а то неудобно. и еще, индикатор доделаю на капслуке хотя бы, что бы когда кириллица - то светился.

не судите строго, сегодня только познакомился с синтаксисом и командами:

;
; ================ переключить раскладку по нажатию на левый CTRL 2 раза по 0.1 сек с таким же промежутком
; паузу между нажатиями компенсируем в длительности второго нажатия (или sleep(50 - ms))
;
~LControl::
KeyWait, LControl, T0.1
if ErrorLevel = 1                                        ; если уложились в 0.1 сек
    Return    
KeyWait, LControl, D T0.2                        ; ждем второго быстрого нажатия
if ErrorLevel = 0    
    PostMessage, 0x50, 2,,, A                    ; переключаем раскладку
Return

23

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Знакомому передал вот такой код для удобства переключения.

;~Rctrl::
~vkA3 Up::
If (A_PriorKey = "RControl"  && !Mouse)
	{
    WinExist("A")
    ControlGetFocus, CtrlFocus
    PostMessage, 0x50, 0, -0xF3FFBE7, %CtrlFocus%
    kbd_msg("RU") 
	}
Mouse := 0	
Return

~vkA2 Up::
If (A_PriorKey = "LControl" && !Mouse)
	{
	WinExist("A")
    ControlGetFocus, CtrlFocus
    PostMessage, 0x050, 0, 0x04070407,%CtrlFocus%
    kbd_msg("DE")
	}
Mouse := 0	
Return

Return


kbd_msg(text)
{
    no_detect_window := -1
    ToolTip, %text%, A_CaretX + 10, A_CaretY - 20
    SetTimer, KbdRemoveToolTip, -1000
    return
    
    KbdRemoveToolTip:
    ToolTip
    no_detect_window := 1
    return
}

  Всё работало отлично. Сейчас у него новый комп и включается только русский.
  Очевидно не совпадает второй идентификатор.
  Но код из другой темы почему-то не помог.

F11::
  Count:=DllCall("GetKeyboardLayoutList", UInt, 0, UInt, 0)
  VarSetCapacity(Buf, Count*4)
  DllCall("GetKeyboardLayoutList", UInt, Count, UInt, &Buf)
  List:=""
  SetFormat, Integer, H
  Loop, % Count
    List.=NumGet(Buf, (A_Index-1)*4) . "`n"
Return

  Показывает только один идентификатор и тот, уже известный.
  Посоветуйте, пожалуйста, что нужно изменить, чтобы определить все идентификаторы.

24

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Правильно так:

layoutNumber := DllCall("GetKeyboardLayoutList", "Int", 0, "Ptr", 0)
VarSetCapacity(buff, A_PtrSize * layoutNumber)
DllCall("GetKeyboardLayoutList", "Int", layoutNumber, "Ptr", &buff)
Loop % layoutNumber
   layoutList .= Format("{:#x}", NumGet(&buff + A_PtrSize*(A_Index - 1), "UInt")) . "`n"
MsgBox, % layoutList
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

25

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Спасибо, отлично работает.

26

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Всегда отлично работало, за что ещё раз спасибо.
Недавно начались проблемы.

В Word от Office 2016 нажатие ~vkA3 Up очень часто (почти всегда) подвешивает Word намертво.

~vkA3 Up::
If (A_PriorKey = "RControl"  && !Mouse)
	{
    WinExist("A")
    ControlGetFocus, CtrlFocus
    PostMessage, 0x50, 0, 0x4190419, %CtrlFocus%
    kbd_msg("RU") 
	}

Можно как-то этого избежать?

27

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Попробуйте в проблемные окна просто посылать сочетание, которое переключает язык с клавиатуры.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28 (изменено: Foma, 2021-03-23 00:08:10)

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Попробовал. С Send висло всё равно. С SendInput перестало. ))
Спасибо!

29 (изменено: Foma, 2021-03-25 13:04:40)

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Мистика продолжается. Думал, что случайность, но теперь ясно, что это правило.
При первом запуске Word первое же нажатие ~vkA3 Up его подвешивает. При повторном и последующих срабатывает как и задумано. А потом снова может подвесить.
Что это вообще такое и можно ли что-то с этим сделать?

30

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Попробуй такой код:

#SingleInstance,Force
#NoEnv
AutoTrim,Off
CoordMode,Mouse,Screen
CoordMode,ToolTip
CoordMode,Caret,Screen
DetectHiddenWindows,On
SendMode,Input
SetBatchLines,-1
SetControlDelay,-1
SetKeyDelay,-1
SetTitleMatchMode,2
SetWinDelay,-1



~vkA3 Up::
If (A_PriorKey = "RControl"  && !Mouse)
  SwitchInputLayout("Rus")
return

RemoveToolTip:
tooltip,,,,3
return


SwitchInputLayout(switch="")
{
  static Locale_RU:=0x04190419, Locale_EN:=0x04090409
  ControlGetFocus,CtrlFocus,A
  ControlGet,id,hwnd,,%CtrlFocus%,A
  MouseGetPos,DF_X,DF_Y
  if !id
    ID:=WinExist("A")
  ThreadID:=DllCall("GetWindowThreadProcessId",Ptr,id,Int,0,ptr)
  Locale:=GetLayot(ThreadID)
  if (switch="Eng")
    Locale:=Locale_RU
  else if (switch="Rus")
    Locale:=Locale_EN
  sendMessage,0x50,,% Locale=Locale_RU ? Locale_EN : Locale_RU,,ahk_id %ID%
  if (Locale=GetLayot(ThreadID))
  {
    send,{alt down}{shift down}{alt up}{shift up}
    sleep,10
    if (Locale=GetLayot(ThreadID))
    {
      if !isWindowFullScreen()
      {
        ToolTip,Невозможно переключить раскладку.,% A_CaretX=0 ? DF_X : A_CaretX+10,% A_CaretY=0 DF_Y ? : A_CaretY-20,3
        SetTimer,RemoveToolTip,-1100
      }
      return 1
    }
  }
  if !isWindowFullScreen()
  {
    ToolTip,% GetLayot(ThreadID)=Locale_RU ? "Русский" : "Английский",% A_CaretX=0 ? DF_X : A_CaretX+10,% A_CaretY=0 DF_Y ? : A_CaretY-20,3
    SetTimer,RemoveToolTip,-1100
  }
}
GetLayot(ThreadID)
{
  return DllCall("GetKeyboardLayout",ptr,ThreadID,ptr)
}

isWindowFullScreen(WinID="")
{
  if !WinID
    WinGet,WinID,id,A
;  WinGet,WinMinMax,MinMax,ahk_id %WinID%
  WinGetPos,WinX,WinY,WinW,WinH,ahk_id %WinID%
;tooltip,% (WinMinMax=0) "`n" WinX "`n" WinY "`n" WinW "`n" WinH
  if ((WinX=0 and WinY=0 and (WinW>=A_ScreenWidth-1 and WinW<=A_ScreenWidth+1) and (WinH>=A_ScreenHeight-1 and WinH<=A_ScreenHeight+1))) ; or WinMinMax!=0)
  {
    WinGetClass,WinClass,ahk_id %WinID%
    WinGet,WinProcessName,ProcessName,ahk_id %WinID%
    SplitPath,WinProcessName,,,WinProcessExt
    if (WinClass!="Progman" and WinClass!="WorkerW" and WinProcessExt!="scr")
      return 1
  }
  return 0
}
Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

31

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Спасибо, попробую.

Пока путём длительных экспериментов пришёл к выводу, что Word-у не нравится именно то, что процесс запускается через Control. При использовании F12 пока ни одного зависания не обнаружил. Само собой F12 годится только для теста, постоянно использовать его крайне неудобно.

32

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Пока ничего не зависло, что радует. Переключается на русский отлично, а вот на немецкий, который у меня вместо английского - нет. Не смотря что я изменил код языка, ну и надписи.

#SingleInstance,Force
#NoEnv
AutoTrim,Off
CoordMode,Mouse,Screen
CoordMode,ToolTip
CoordMode,Caret,Screen
DetectHiddenWindows,On
SendMode,Input
SetBatchLines,-1
SetControlDelay,-1
SetKeyDelay,-1
SetTitleMatchMode,2
SetWinDelay,-1



~vkA3 Up::
If (A_PriorKey = "RControl"  && !Mouse)
  SwitchInputLayout("Rus")
return

RemoveToolTip:
tooltip,,,,3
return


SwitchInputLayout(switch="")
{
  static Locale_RU:=0x04190419, Locale_DE:=0x0407
  ControlGetFocus,CtrlFocus,A
  ControlGet,id,hwnd,,%CtrlFocus%,A
  MouseGetPos,DF_X,DF_Y
  if !id
    ID:=WinExist("A")
  ThreadID:=DllCall("GetWindowThreadProcessId",Ptr,id,Int,0,ptr)
  Locale:=GetLayot(ThreadID)
  if (switch="DE")
    Locale:=Locale_RU
  else if (switch="Rus")
    Locale:=Locale_DE
  sendMessage,0x50,,% Locale=Locale_RU ? Locale_DE : Locale_RU,,ahk_id %ID%
  if (Locale=GetLayot(ThreadID))
  {
    send,{alt down}{shift down}{alt up}{shift up}
    sleep,10
    if (Locale=GetLayot(ThreadID))
    {
      if !isWindowFullScreen()
      {
        ToolTip,Невозможно переключить раскладку.,% A_CaretX=0 ? DF_X : A_CaretX+10,% A_CaretY=0 DF_Y ? : A_CaretY-20,3
        SetTimer,RemoveToolTip,-1100
      }
      return 1
    }
  }
  if !isWindowFullScreen()
  {
    ToolTip,% GetLayot(ThreadID)=Locale_RU ? "Русский" : "Немецкий",% A_CaretX=0 ? DF_X : A_CaretX+10,% A_CaretY=0 DF_Y ? : A_CaretY-20,3
    SetTimer,RemoveToolTip,-1100
  }
}
GetLayot(ThreadID)
{
  return DllCall("GetKeyboardLayout",ptr,ThreadID,ptr)
}

isWindowFullScreen(WinID="")
{
  if !WinID
    WinGet,WinID,id,A
;  WinGet,WinMinMax,MinMax,ahk_id %WinID%
  WinGetPos,WinX,WinY,WinW,WinH,ahk_id %WinID%
;tooltip,% (WinMinMax=0) "`n" WinX "`n" WinY "`n" WinW "`n" WinH
  if ((WinX=0 and WinY=0 and (WinW>=A_ScreenWidth-1 and WinW<=A_ScreenWidth+1) and (WinH>=A_ScreenHeight-1 and WinH<=A_ScreenHeight+1))) ; or WinMinMax!=0)
  {
    WinGetClass,WinClass,ahk_id %WinID%
    WinGet,WinProcessName,ProcessName,ahk_id %WinID%
    SplitPath,WinProcessName,,,WinProcessExt
    if (WinClass!="Progman" and WinClass!="WorkerW" and WinProcessExt!="scr")
      return 1
  }
  return 0
}

Не подскажете в чём дело?

33

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Особо не гуглил, но может так(?):

0x04190419, Locale_DE:=0x04070407

Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

34

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Нет, не помогло. И в старом варианте именно так работало, как я заменил.
Но я видать чего-то не понимаю. Старый вариант был настроен так:
LCtrl - всегда немецкий,
RCtrl - всегда русский.
У вас фигурирует только Rctrl и по нему задумано переключение по кругу? Это не совсем то, что было, и чего я добиваюсь.
Я бы оставил старый способ управления. Вот только суметь бы передать команду в Word так, чтобы он не вис!
Вы, как я понял, использовали сочетание клавиш именно для переключение по кругу, возможно поэтому он не виснет. Но, к сожалению, это не то что мне нужно.

35

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Попробуй в своей версии использовать SendMessage вместо Post, и добавить сверху:

#SingleInstance,Force
#NoEnv
AutoTrim,Off
CoordMode,Mouse,Screen
CoordMode,ToolTip
CoordMode,Caret,Screen
DetectHiddenWindows,On
SendMode,Input
SetBatchLines,-1
SetControlDelay,-1
SetKeyDelay,-1
SetTitleMatchMode,2
SetWinDelay,-1 
Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

36 (изменено: teadrinker, 2021-03-31 23:09:18)

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Alectric пишет:

и добавить сверху

Что за карго-культ?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

37 (изменено: Foma, 2021-04-01 11:42:45)

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Попробовал заменить шапку в моей версии. Зависло сразу после попытки переключения.
Попробовал оставить висящим, вернулся к нему через полчаса - работает и вроде не виснет. Чудеса.

38

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

А можно подойти к проблеме с другой стороны? Отправлять нажатия не в сам Word, а в саму панель переключения языка ввода?

39

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Foma пишет:

а в саму панель переключения языка

Как я понимаю раскладка переключается именно в "контроле окна" (ControlGetFocus) с которым работает пользователь.

Foma пишет:

Rctrl и по нему задумано переключение по кругу?

Нет не по кругу. Переключение на указанную в скобках.
Чтобы переключалось по кругу нужно оставить скобки пустыми.

Попробуй этот код и посмотри какой "LocaleId" покажет когда у тебя текущая раскладка немецкий.
То значение нужно будет указать в Locale_DE.

#SingleInstance,Force
#NoEnv
AutoTrim,Off
CoordMode,Mouse,Screen
CoordMode,ToolTip
CoordMode,Caret,Screen
DetectHiddenWindows,On
SendMode,Input
SetBatchLines,-1
SetControlDelay,-1
SetKeyDelay,-1
SetTitleMatchMode,2
SetWinDelay,-1



~vkA3 Up::
SwitchInputLayout()
return



RemoveToolTip:
tooltip,,,,3
return


SwitchInputLayout(switch="")
{
  static Locale_RU:=0x04190419, Locale_DE:=0x0407
  ControlGetFocus,CtrlFocus,A
  ControlGet,id,hwnd,,%CtrlFocus%,A
  MouseGetPos,DF_X,DF_Y
  if !id
    ID:=WinExist("A")
  ThreadID:=DllCall("GetWindowThreadProcessId",Ptr,id,Int,0,ptr)
  Locale:=GetLayot(ThreadID)
tooltip,% "LocaleId=" format("0x{:02x}",Locale),0
  if (switch="DE")
    Locale:=Locale_RU
  else if (switch="Rus")
    Locale:=Locale_DE
  sendMessage,0x50,,% Locale=Locale_RU ? Locale_DE : Locale_RU,,ahk_id %ID%
  if (Locale=GetLayot(ThreadID))
  {
    send,{alt down}{shift down}{alt up}{shift up}
    sleep,10
    if (Locale=GetLayot(ThreadID))
    {
      if !isWindowFullScreen()
      {
        ToolTip,Невозможно переключить раскладку.,% A_CaretX=0 ? DF_X : A_CaretX+10,% A_CaretY=0 DF_Y ? : A_CaretY-20,3
        SetTimer,RemoveToolTip,-1100
      }
      return 1
    }
  }
  if !isWindowFullScreen()
  {
    ToolTip,% GetLayot(ThreadID)=Locale_RU ? "Русский" : "Немецкий",% A_CaretX=0 ? DF_X : A_CaretX+10,% A_CaretY=0 DF_Y ? : A_CaretY-20,3
    SetTimer,RemoveToolTip,-1100
  }
}
GetLayot(ThreadID)
{
  return DllCall("GetKeyboardLayout",ptr,ThreadID,ptr)
}

isWindowFullScreen(WinID="")
{
  if !WinID
    WinGet,WinID,id,A
;  WinGet,WinMinMax,MinMax,ahk_id %WinID%
  WinGetPos,WinX,WinY,WinW,WinH,ahk_id %WinID%
;tooltip,% (WinMinMax=0) "`n" WinX "`n" WinY "`n" WinW "`n" WinH
  if ((WinX=0 and WinY=0 and (WinW>=A_ScreenWidth-1 and WinW<=A_ScreenWidth+1) and (WinH>=A_ScreenHeight-1 and WinH<=A_ScreenHeight+1))) ; or WinMinMax!=0)
  {
    WinGetClass,WinClass,ahk_id %WinID%
    WinGet,WinProcessName,ProcessName,ahk_id %WinID%
    SplitPath,WinProcessName,,,WinProcessExt
    if (WinClass!="Progman" and WinClass!="WorkerW" and WinProcessExt!="scr")
      return 1
  }
  return 0
}
Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

40 (изменено: Foma, 2021-04-02 18:54:18)

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Спасибо! Позже напишу, что вышло.
Переключает по кругу по правому контролу.
Немецкий - 0x4070407

41

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Оказывается и не в Ctrl дело - только что зависло по F12.

42

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Как всегда, оказалось что схожие проблемы бывали и других людей. Правда с KeySwitcher и PuntoSwitcher.
Рекомендация

В параметрах Word на вкладке Дополнительно убрать галочку напротив опции "Использовать автозавершение".

Мне вроде помогло, но пишут, что проблема не до конца решается. Тогда ещё:

Идем в реестр
Пуск > Выполнить > Regedit!
HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > CTF > SystemShared
Выставить значение - "CUAS"=dword:00000001

Позже отпишусь ещё.

43

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Первое не помогло, второго у меня в реестре вообще нет. (

44

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Я б на вашем месте забил, но если так уж заморочились, поставьте что-нибудь вроде AutoHotInterception и посылайте нажатия от драйвера.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

45

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Я бы забил, но Word нужен и к кнопкам этим я за 20 лет привык. Да и удобнее ничего не придумать.
Спасибо за подсказку. Скачал, пока ничего не понял.

46

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Там же подробная инструкция есть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

47

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Есть. Только не всё ясно. Например

To use the AutoHotkey library, you should copy `interception.dll` into this folder from `library\x64` in the Interception zip 
YOU MAY ALSO NEED TO RUN UNBLOCKER.PS1 AS ADMIN!!

  Нет ни zip-а этого, ни dll. Как запускать .ps1 тоже пока не понял.

48

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Ок. Как вы советовали - забил. Поставил PuntoSwitcher - работает.