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

第一目标:只用小狼毫输入法(默认英文),由于:

第二目标:英文+小狼毫输入法,需要 AutoHotkey 能获取当前是英文键盘还是小狼毫,这样能实现在不同输入法状态使用不同的鼠标形状

还用到 imetool.exe 小工具,从win7时一直在用的。

英文有美国键盘和英国键盘之分,

但是美国键盘属于中文系的,AutoHotkey无法区分当前是小狼毫输入法还是美国键盘输入法

所以就只好用英文键盘了,不爽的就是用小狼毫时,托盘图标会多个 CH 图标(win7时还强迫症用脚本删除该图标,现在只能忍忍)

英文时是单个 EN 图标。

删除英文输入法只剩小狼毫时,又会出现两个小狼毫(BUG,影响 Win-Space 无脑切换)

实现方式:

  • windows语言只安装中文即可
  • 中文输入法只放小狼毫
  • imetool 删除所有输入法
  • 这时只有小狼毫输入法,用AutoHotkey脚本 changeIME("04090409") 强制转到英文输入法,就会自动添加了,这样在 imetool 和 HKEY_CURRENT_USER\Keyboard Layout\Preload 下都是的,却不影响正常使用。
  • 在需要强制英文的时候,只需要 changeIME("04090409") 

相关代码:

;切换输入法
changeIME(sID)
{
    WinActive("A")
    ctl := ControlGetFocus() || WinGetID()
    PostMessage(0x50,, dllcall("LoadKeyboardLayout", "str",sID, "uint",1), ctl, "A") ;NOTE 美国英语要用"08040804" 若不放ctl 在TC帮助的查找窗口无法切换
}

;在用的所有输入法sID(8位16进制字符串)
;TODO 小狼毫 ****0804,而不是 E**
arrUsingSid()
{
    cnt := dllcall("GetKeyboardLayoutList", "uint",0, "uint",0)
    VarSetCapacity(hkl, cnt*4, 0)
    dllcall("GetKeyboardLayoutList", "uint",cnt, "uint",&hkl)
    arr := []
    loop(cnt)
    {
        sID := format("{:08X}", numget(hkl,(A_Index-1)*4))
        ;sID := (sID = "08040804") ? "00000804" : sID
        arr.push(sID)
    }
    return arr
    ;方法2 见 HKEY_CURRENT_USER\Keyboard Layout\Preload
}

;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
}