AutoHotkey+BUG小狼毫+BUG win10输入法设置的艰难摸索(未完待续)
第一目标:只用小狼毫输入法(默认英文),由于:
- AutoHotkey无法获取小狼毫当前是英文还是中文状态,这样在必须要英文的情景下,还需手工切换,不理想。见 https://github.com/rime/weasel/issues/468
- 但由于小狼毫英文状态下,在gvim中快速输入会自动转为中文,相关bug见 https://github.com/rime/weasel/issues/362 https://github.com/rime/weasel/issues/232 ,放弃!
第二目标:英文+小狼毫输入法,需要 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 }