使用 AHK 在 VS Code 中根據上下文自動切換輸入法狀態


平常在VS Code打公式,中英文切換一直狂點 Shift 手都快按斷了,於是試圖用 AutoHotKey 搞一些自動切換輸入法程序,讓它根據當前輸入環境自動切輸入法。

之前在網上搜到的是切換鍵盤的(微軟拼音和美式鍵盤),但是我的電腦上只有微軟拼音。一開始搜不到簡單易懂的切換中英文的方法,能搜到的只有一個日本人寫的 AHK V1 版本,但基本看不懂。或許最好的方法是找到接口,然后直接切中英文,於是開始一通亂搜,最終用 AHK V2 + Ultra IME Toggler 插件 實現了功能。

更新:此插件已停止更新,僅作技術交流使用,歡迎移步新插件:Shift IM for Math


檢測中英文狀態的接口

轉機在這里,一通亂搜找到了這個

這是用 AutoHotKey V2 版本寫的,可讀性要比 V1 好些。一番嘗試,最終找到了判斷當前輸入法中英文的核心代碼,如下所示

DetectHiddenWindows True
isEnglishMode(){
    hWnd := winGetID("A")
    result := SendMessage(
        0x283, ; Message : WM_IME_CONTROL
        0x001, ; wParam : IMC_GETCONVERSIONMODE
        0,     ; lParam : (NoArgs)
        ,      ; Control : (Window)
               ; Retrieves the default window handle to the IME class.
        "ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
    )
    ; 返回值是0表示是英文模式,其他值表明是中文模式
    return result == 0
}

這一段代碼使用 SendMessage 來獲得輸入法的狀態,其中:

  • 0x283 信息代表的是 WM_IME_CONTROL ,即“控制輸入法”;
  • 0x001 對應的信息是 IMC_GETCONVERSIONMODE ,即“拿到輸入法中英文狀態”。
  • 另外用 winGetID 拿到窗口。

SendMessage() 最后返回 0 或者 1 ,分別代表中英文模式。

然后只要根據返回值,就可以判斷中英文模式了。能判斷了就好辦,可以根據需要發送按鍵來切中英文了。

去掉注釋后(就是分號 ; 后面的部分),代碼如下,是不是很簡單?

DetectHiddenWindows True
isEnglishMode(){
    hWnd := winGetID("A")
    result := SendMessage(
    	0x283, 0x001, 0,, "ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
    )
    return result == 0
}

后面可以加上類似這種代碼,如下面的示例就是一個“強制左 Shift 切成中文”的方法:

LShift::{
    if(isEnglishMode())
        Send "{Shift}"
}

切換中英文狀態的接口

接下來更進一步,能不能直接用 WinApi 控制輸入法中英文?

查了好久,最終發現和上面的是鄰居:0x001 改成 0x002 就是 IMC_SETCONVERSIONMODE ,即控制中英文狀態的接口!這個懷疑不同輸入法不一樣,有的似乎是 0x006

然后將 lParam 傳一個參數,一般 1025 表示中文,0 表示英文,參考這篇文章。這樣執行函數,就能直接設定中英文模式!

如下面就是一個完整的左 Shift 切成中文的 ahk V2 程序,簡單粗暴:

LShift::{
    DetectHiddenWindows True
    hWnd := winGetID("A")
    SendMessage(
        0x283, ; Message : WM_IME_CONTROL
        0x002, ; wParam : IMC_SETCONVERSIONMODE
        1025,  ; lParam :1025 - CN
        ,
        "ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
    )
}

是不是很好用!

與 VS Code 聯動!

折騰這個的原意是 免去在 VSCode 上寫 \(LaTeX\)markdown 時切換中英文的麻煩 。於是采取簡單粗暴的方法:把上述 ahk 程序封裝成exe,切成中英文分別寫一個。然后寫一個擴展!省事一點,調用 HyperScopes 插件拿到當前的 Scopes ,如果檢測到公式環境,就自動切成英文,公式外面切成中文,只要調用相應的 exe 即可。

最后成功實現,效果如下圖(注意輸入法狀態):

image

實測切換的延時大概 0.02s,基本感受不到了。

如果想體驗一下測試版,可以從 Github 上或者 藍奏雲-密碼7o5t下載 IMEtoCN.exeIMEtoEN.exe ,放到一個特定的文件夾,再將這個文件夾添加到環境變量(可能需要重啟計算機),插件市場搜索 Ultra IME Toggler 安裝,然后就可以體驗了!

來 Github 給個 ⭐ 呀!


原文鏈接:https://www.cnblogs.com/yf-zhao/p/16018481.html 轉載請注明出處!


免責聲明!

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



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