Autohotkey 开关键盘布局工作,但并不总是如此

Autohotkey 开关键盘布局工作,但并不总是如此,autohotkey,Autohotkey,我对自动热键有点陌生 我安装了3种语言,其中一种我很少使用。所以我只想使用WIN+Space在两种语言(EN-RU)之间切换。 我在网上搜索了一些代码,这些代码很短,逻辑上很接近我的需要,我做了一些修改,使之更像对象,更个性化。 代码:全选-展开视图 #Space:: SetFormat, Integer, H Lang := { "EN" : "0x4090409" , "RU" : "0x4190419", "HE": "0x40D040D" } WinGet, WinID,,

我对自动热键有点陌生

我安装了3种语言,其中一种我很少使用。所以我只想使用WIN+Space在两种语言(EN-RU)之间切换。 我在网上搜索了一些代码,这些代码很短,逻辑上很接近我的需要,我做了一些修改,使之更像对象,更个性化。 代码:全选-展开视图

#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、记事本、记事本++、概念、VScode、Android Studio、IntelliJ IDEA、, 无法工作:OneNote Windows 10应用程序(即使在OneNote 2016中也可以正常工作)

如果有人能帮我,我将不胜感激。 提前谢谢

相关答案


您可能根本不需要为此创建热键。在下面的链接中,将讨论Windows在特定语言之间切换或直接切换到特定语言的功能。事实上,它甚至为EN和RU显示了它。(只是猜测)此外,由于热键
#Space
与内置的Windows热键相同,这可能是问题的根源。感谢回复!这个例子的问题是它会在我所有的3种语言(EN-HE-RU)之间切换。为每个按钮定义按键开关是不舒服的。所以这就是我尝试编写代码在两种语言之间切换的原因。不幸的是,在Onenote旁边,代码在大多数情况下运行良好。我试过另一个组合键,问题是一样的。在尝试复制您的问题时,我也遇到了Edge的此问题。我怀疑这可能适用于所有UWP应用。下面是一些供进一步研究的链接:非常感谢您的帮助)对于我来说,无论是在Edge中还是在任务栏处于活动状态时,这仍然不起作用。OneNote UWP应用程序中是否适用于您?不过,有趣的是,当桌面处于活动状态时,它确实可以工作。由于此功能始终可用,解决方案可能在于将其发送到该应用程序。是的,至少目前有效)在我尝试的每个应用程序中,包括Onenote和Edge,这就是我在此处共享此功能的原因)我发布的链接中还有另一个代码变体,您可以尝试。
  #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