東京啖食種般的痛點(diǎn)
記筆記蔽介、寫代碼和切換 vim 的模式摘投,這些場(chǎng)景中英文輸入法切換,太令人糾結(jié)了屉佳。
這次 Win11_更新(1000.22000.282.0)解決了我的電腦上個(gè)版本還能用戶登錄桌面的故障谷朝,然后無(wú)限次開機(jī)黑屏洲押,無(wú)奈重裝系統(tǒng)武花,從零開始。
習(xí)慣第三方插件輸入法好多年了杈帐,這次嘗試用下系統(tǒng)自帶的微軟拼音体箕,好處是沒(méi)廣告,內(nèi)置原生可能更快挑童。
好家伙累铅,AHK 腳本失效了,檢測(cè)不到中英文模式站叼。翻遍網(wǎng)絡(luò)娃兽,研究一天一夜,踩坑無(wú)數(shù)尽楔。第二天問(wèn)了群友投储,幫找接口,受到啟發(fā)阔馋,完善了代碼玛荞。
方案一 獲取當(dāng)前窗口輸入法的中文 / 英文模式(單個(gè)輸入法)
;---------------------------------------------------------------------o
; IMEの狀態(tài)の取
; 対象: AHK v2.0.0以升
; WinTitle : 対象Window (省略時(shí):アクティブウィンドウ)
; 戻り値 1:ON 0:OFF
; (但似乎找不到檢測(cè)懸浮窗的接口,所以利用 AHK 搜圖特性代替)
; API: https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-control
; API: https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms920833(v=msdn.10)
; API: https://docs.microsoft.com/zh-cn/windows/win32/intl/input-method-manager-functions
;---------------------------------------------------------------------o
hasIME(WinTitle:="A")
{
try {
hWnd := WinGetID(WinTitle)
} catch Err {
; ^Esc 開始菜單彈窗呕寝,卡死在找不到當(dāng)前窗口
return
}
DetectHiddenWindows True
result := SendMessage(
0x283, ; Message : WM_IME_CONTROL
0x001, ; wParam : IMC_GETCONVERSIONMODE
0, ; lParam : (NoArgs)
, ; Control : (Window)
; 獲取當(dāng)前輸入法的模式
"ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
)
DetectHiddenWindows False
; 微軟拼音(英-中勋眯,新/舊,新舊/新舊)0/1024-1/1025
; 搜狗五筆 0-1025
; 手心 1024-1025
; 搜狗拼音中英都是1025(無(wú)效)
return (result == 1 or result == 1025)
}
;---------------------------------------------------------------------o
還有監(jiān)測(cè)是否正在打拼音的函數(shù),為什么強(qiáng)調(diào)這個(gè)函數(shù)呢客蹋?
因?yàn)槲④浧匆羯?jí)了塞蹭,它白色的 UI 可以 WinSpy 看出來(lái),但監(jiān)測(cè)不到是否存在嚼酝,因?yàn)橐恢痹诤笈_(tái)偷偷運(yùn)行浮还。(坑)下面是兼容老版本,對(duì)于 Vim 用戶懂的都懂闽巩。
isNotTypingPinYin() {
; 策略模式:保持原接口不變钧舌,實(shí)現(xiàn)方式根據(jù)場(chǎng)景可選
; 系統(tǒng)有時(shí)會(huì)自動(dòng)降級(jí)兼容,太詭異了
return !(isTypingPinYinImg() or isTypingPinYinWin())
}
isTypingPinYinWin() {
; 適用藍(lán)底白字老版本涎跨,Win11白皮膚接口失效洼冻,因?yàn)榇翱诔qv后臺(tái)
return WinExist("ahk_class Microsoft.IME.UIManager.CandidateWindow.Host")
}
isTypingPinYinImg() {
; 適用新版微軟拼音,截圖桃心
CoordMode "Pixel" ; 將下面的坐標(biāo)解釋為相對(duì)于屏幕而不是活動(dòng)窗口.
return ImageSearch(FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, "bin\img\IMElogo.png")
}
微軟拼音的配置隅很,能砍則砍:
微軟輸入法配置
- 刪除其他輸入法撞牢,只保留微軟拼音。
- [設(shè)置] 使用 Ctrl + 空格鍵 切換輸入法叔营。獲取中英文模式后屋彪,利用這個(gè)特性,自己分情況切換輸入法绒尊。
- [取消] 切換語(yǔ)言畜挥、切換到某輸入法的熱鍵。對(duì)于我這種喜歡用 AHK 的腳本怪來(lái)說(shuō)婴谱,每個(gè)鍵能省則省蟹但。
方案二 獲取微軟拼音的身份證(多個(gè)輸入法)
;---------------------------------------------------------------------o
; IMEの狀態(tài)の取(添加英文語(yǔ)言谭羔,其他輸入法华糖,關(guān)閉每個(gè)窗口不同的輸入法)
; 対象: AHK v2.0.0以升
; WinTitle : 対象Window (省略時(shí):アクティブウィンドウ)
; 戻り値 1:ON 0:OFF
; API: https://docs.microsoft.com/zh-cn/windows/win32/intl/input-method-manager-functions
; via: http://www.reibang.com/p/c1b412c25712
;---------------------------------------------------------------------o
global keyboardLayoutId := Map(
"中文", 134481924,
"EN", 67699721,
)
;---------------------------------------------------------------------o
hasIME(WinTitle:="A")
{
try {
hWnd := WinGetID(WinTitle)
} catch Err {
; ^Esc 開始菜單彈窗,卡死在找不到當(dāng)前窗口
return
}
DetectHiddenWindows True
ThreadID:=DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
InputLocaleID:=DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
DetectHiddenWindows False
; 1 非英文狀態(tài)
; 0 英文狀態(tài)
return InputLocaleID == keyboardLayoutId["中文"]
}
;---------------------------------------------------------------------o
setIME(language)
{
Sleep 50 ; 等一等是為了承接窗口切換的緩沖
PostMessage(0x50, 0, keyboardLayoutId[language],, WinGetTitle("A"))
}
;---------------------------------------------------------------------o
這時(shí)可以設(shè)置瘟裸,添加英文語(yǔ)言客叉,自己再定義切換輸入法的快捷鍵。
這兩個(gè)方案话告,都要參考一下避坑指南
翻譯一下微軟拼音的辣 ?? 特色(避坑指南)
- [取消] 為每個(gè)應(yīng)用窗口使用不同的輸入法兼搏。(多個(gè)輸入法可能切換回中文,會(huì)鎖死英文模式超棺,看個(gè)人需求了向族,開啟也行)
- [取消] 多語(yǔ)言文本建議(看起高大上,其實(shí)就是英文模式下棠绘,仍使用中文標(biāo)點(diǎn)符號(hào))
- [取消] 鍵入見(jiàn)解(一直零記錄件相,沒(méi)用)
- [取消] 物理鍵盤上鍵入時(shí)顯示文本建議 (你個(gè)輸入法提了什么建議再扭?)
- 自定義短語(yǔ)不支持 u / v 開頭,雙拼用戶表示費(fèi)解夜矗。
-
導(dǎo)出的格式泛范,文本打開都是亂碼,轉(zhuǎn)換不方便紊撕,搞封閉搞習(xí)慣了罢荡。
皮膚簡(jiǎn)潔