第一目标:只用小狼毫输入法(默认英文),由于:
- 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
}
来源:oschina
链接:https://my.oschina.net/u/4312205/blog/3226042