Переключение раскладки клавиатуры работает, но не всегда - PullRequest
3 голосов
/ 01 ноября 2019

Я немного новичок в Autohotkey.

У меня установлено 3 языка, один из которых я использую очень редко. поэтому я хочу переключаться между двумя языками (EN-RU), используя WIN + Space. Я искал в сети найденный код, который был коротким и логически близким к моим потребностям, я сделал некоторые изменения, чтобы сделать объект более похожим и персонализированным. Код: выбрать все - развернуть представление

#Space::
  SetFormat, Integer, H
  Lang := { "EN" : "0x4090409" , "RU" : "0x4190419", "HE": "0x40D040D" }

  WinGet, WinID,, A
  ThreadID:=DllCall("GetWindowThreadProcessId", "Int", WinID, "Int", "0")
  InputLocaleID:=DllCall("GetKeyboardLayout", "Int", ThreadID)

  if(InputLocaleID=Lang.RU OR InputLocaleID=Lang.HE)
    SendMessage, 0x50,, % Lang.EN,, A
  else if(InputLocaleID=Lang.EN)
    SendMessage, 0x50,, % Lang.RU,, A
Exit

хорошо работает с большинством программ, но с немногими из них переключается только на RU.

хорошо работает: Chrome, notePad, notePad ++,Понятие, VScode, Android Studio, IntelliJ IDEA, не работает: приложение OneNote для Windows 10 (даже в Onenote 2016 оно отлично работает)

Если кто-то может мне помочь с этим, я был бы очень признателен. Заранее спасибо!

1 Ответ

0 голосов
/ 04 ноября 2019

связанный ответ Autohotkey Forum

  #Space:: ;  Switch keyboard (EN-RU)

    Lang := { "EN": 0x4090409, "RU": 0x4190419 }
    ; For compatibility with UWP apps, get the thread of the focused
    ; control, not the active window.  This is necessary because those
    ; apps are hosted within a window owned by a different process.
    ControlGetFocus Focused, A
    ControlGet CtrlID, Hwnd,, % Focused, A
    ; Using Ptr vs. Int vs. UInt won't matter in these cases
    ThreadID := DllCall("GetWindowThreadProcessId", "Ptr", CtrlID, "Ptr", 0)
    ; HKL is a handle type (64-bit on x64)
    InputLocaleID := DllCall("GetKeyboardLayout", "UInt", ThreadID, "Ptr")

    if (InputLocaleID != Lang.EN)
      SendMessage, 0x50,, % Lang.EN,, ahk_id %CtrlID%
    else
      SendMessage, 0x50,, % Lang.RU,, ahk_id %CtrlID%
    Exit

...