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
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM