AutoHotkey+BUG小狼毫+BUG win10输入法设置的艰难摸索(未完待续)

目标:

  1. 默认英文输入法(常规设置无效,暂时还未找到解决方案)
  2. 用脚本能精确转成英文或中文输入法,在某些情况下就能减少手工切换的过程,比如win-r后自动转成英文输入法

最优雅的方式(暂时不可用):只用一个输入法(小狼毫)

这样只需要用Shift键切换状态即可

不可用原因:

  1. AutoHotkey无法获取小狼毫当前是英文还是中文状态,这样在必须要英文的情景下,无法保证是英语状态,不理想。见 https://github.com/rime/weasel/issues/468
  2. 小狼毫英文状态下,在gvim中快速输入会自动转为中文,相关bug见

常规方式:英文+小狼毫输入法

英文有【中文-美式键盘】和【英语-美式键盘】(需要添加语言English (United States)),要用后者,原因:
AutoHotkey暂时无法区分当前是【小狼毫】还是【中文-美式键盘】输入法

用ahk切换输入法,附上 AutoHotkey v2-beta 代码

;i 0=英文 1=中文
toIME(i:=1) {
    ;获取sID
    if (type(i) == "Integer") {
        switch i {
        case 0: sID := "00000409" ;美式键盘-ENG
        case 1: sID := "00000804" ;中文 也可用 E0200804
        default: return
        }
    } else {
        sID := i
    }
    WinActive("A")
    ctl := ControlGetFocus() || WinGetID()
    PostMessage(0x50,, dllcall("LoadKeyboardLayout", "str",sID, "uint",1), ctl)
}

;TODO rime和极点无效,微软拼音可以
;某日本人脚本中的获取输入法中英文状态(英文0,中文1)
getState(winTitle:="A") {
    if !(idWIn := WinExist(winTitle))
        return
    DefaultIMEWnd := dllcall("imm32\ImmGetDefaultIMEWnd", "uint",idWin, "uint")
    DetectSave := A_DetectHiddenWindows
    DetectHiddenWindows true
    res := SendMessage(WM_IME_CONTROL:=0x283, IMC_GETOPENSTATUS:=5,,, "ahk_id " . DefaultIMEWnd)
    DetectHiddenWindows DetectSave
    return res
}
 
posted @ 2020-04-08 08:44  火冷  阅读(1872)  评论(11编辑  收藏  举报