平常在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 即可。
最后成功實現,效果如下圖(注意輸入法狀態):
實測切換的延時大概 0.02s,基本感受不到了。
如果想體驗一下測試版,可以從 Github 上或者 藍奏雲-密碼7o5t下載 IMEtoCN.exe
和 IMEtoEN.exe
,放到一個特定的文件夾,再將這個文件夾添加到環境變量(可能需要重啟計算機),插件市場搜索 Ultra IME Toggler
安裝,然后就可以體驗了!
來 Github 給個 ⭐ 呀!

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