第一目標:只用小狼毫輸入法(默認英文),由於:
- 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 }