拿什么拯救你度陆,巨硬的微軟拼音——AHK實(shí)現(xiàn)切換自由

東京啖食種般的痛點(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)潔
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市对扶,隨后出現(xiàn)的幾起案子区赵,更是在濱河造成了極大的恐慌,老刑警劉巖浪南,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笼才,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡络凿,警方通過(guò)查閱死者的電腦和手機(jī)骡送,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)絮记,“玉大人摔踱,你說(shuō)我怎么就攤上這事≡狗撸” “怎么了派敷?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)憔四。 經(jīng)常有香客問(wèn)我膀息,道長(zhǎng)般眉,這世上最難降的妖魔是什么了赵? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮甸赃,結(jié)果婚禮上柿汛,老公的妹妹穿的比我還像新娘。我一直安慰自己埠对,他們只是感情好络断,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著项玛,像睡著了一般貌笨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上襟沮,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天锥惋,我揣著相機(jī)與錄音昌腰,去河邊找鬼。 笑死膀跌,一個(gè)胖子當(dāng)著我的面吹牛遭商,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捅伤,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼劫流,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了丛忆?” 一聲冷哼從身側(cè)響起祠汇,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熄诡,沒(méi)想到半個(gè)月后座哩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粮彤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年根穷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片导坟。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屿良,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惫周,到底是詐尸還是另有隱情尘惧,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布递递,位于F島的核電站喷橙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏登舞。R本人自食惡果不足惜贰逾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菠秒。 院中可真熱鬧疙剑,春花似錦、人聲如沸践叠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)禁灼。三九已至管挟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弄捕,已是汗流浹背僻孝。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工拳芙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皮璧。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓舟扎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悴务。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睹限,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容