美文网首页
AHK 实现中英文输入法自由

AHK 实现中英文输入法自由

作者: Miozus | 来源:发表于2021-09-17 19:23 被阅读0次

    核心思想

    学会忘记所有输入法的状态

    为你的常用程序分别设置初始状态

    每次切换回来

    默默自动初始化中文 / 英文输入法状态

    然后你要做的

    就是直接开始敲键盘

    忘记它的的状态

    为了达到这个目的,我们只实现需要一个简单的接口:

    设置当前输入法的函数为 EN / 中文

    设置为英文输入法
    然后呢,我们从哪些场景开始动手改造呢?

    ⌨ 1. 快捷键切换程序(键盘点名)

    ; 激活或运行, 默认值为英文输入法(如需中文,再加逗号和 "中文" 要包含双引号)
    activateOrRun(title, exe_path, language:="EN"){
        if WinExist(title) {
            WinActivate
        }
        else {
            Run exe_path 
        }
        setIME(language) ; 默认以小写开始
    }
    
    

    调用范例

    
    CapsLock & v:: 
        activateOrRun("ahk_exe Code.exe", "D:\TOOLS\Microsoft VS Code\Code.exe")
        setIME("EN")
    return
    

    🖱 2. 鼠标左键单击窗口(鼠标点名)

    鼠标单击时,获取当前窗口的进程名字。如果包含 IDE ,则切换为英文。

    setIDEIME(language:="EN")
    {
        MouseGetPos , , ahkId
        title := WinGetProcessName(ahkId)
        ToolTip title
        if InStr(title, "idea64.exe") or InStr(title, "Code.exe")
        {
            setIME("EN")
        }
    }
    

    绑定到鼠标单击事件

    ~LButton::
    {
        setIDEIME("EN")
    }
    
    ~LButton up::
    {
        Sleep 1000
        ToolTip
    }
    

    🧚🏻♂️ 3. IDE 写代码与写注释切换(Vim 痛骨贴)

    Idea激活时,以下上下文管理的代码优先级最高(覆盖旧方法)

    ;=====================================================================o
    #Hotif WinActive("ahk_exe idea64.exe")
    ;---------------------------------------------------------------------o
    ; VIM 敏感: 在中文注释、普通模式和插入模式的边界,自动切换输入法
    :?*b0:o// ::
    :?*b0:a// ::
    :?*b0:i// ::
    :?*b0:// ::
    {
        setIME("中文")
    }
    #HotIf
    ;---------------------------------------------------------------------o
    
    ;=====================================================================o
    #Hotif WinActive("ahk_exe idea64.exe") or WinActive("ahk_exe Code.exe")
    ;---------------------------------------------------------------------o
    ; VIM 敏感: 在中文注释、普通模式和插入模式的边界,自动切换输入法
    Esc::
    CapsLock::
    {
        Send "{Esc}"
        ; 如果正在打拼音,就不切换输入法
        if !WinExist("ahk_class QQPinyinCompWndTSF") {
            setIME("EN")
        }
    }
    #HotIf
    ;---------------------------------------------------------------------o
    
    ;=====================================================================o
    #Hotif WinActive("ahk_exe Code.exe")
    ;---------------------------------------------------------------------o
    ; VIM 敏感: 在中文注释、普通模式和插入模式的边界,自动切换输入法
    :*b0:o; ::
    :*b0:a; ::
    :*b0:i; ::
    :*b0:; ::
    {
        setIME("中文")
    }
    #Hotif
    ;---------------------------------------------------------------------o
    

    🤔 4. 莫名其妙不知身在何处(基础接口)

    RShift :短按切换中英文输入法,长按仍旧上档键

    ;=====================================================================o
    ;                    IME Status Utils
    ;---------------------------------------------------------------------o
    ; 功能:短按切换中英文输入法,长按仍旧上档键
    ; 作者:知乎 @查理
    ; 时间:2021年9月
    ; 更新:https://www.zhihu.com/question/470805790/answer/2022570065
    ;---------------------------------------------------------------------o
    ~$RShift:: return
    ~$RShift up:: switchIME()
    ;---------------------------------------------------------------------o
    switchIME()
    {
        timeInterval := 50  ; 此数值96次测试,大于50则短按稳定, 变量放函数之外可能会被污染
        if (A_TimeSincePriorHotkey > timeInterval && A_PriorKey = "RShift") {
            ToolTip
            if (hasIME() = 1) {
                Send "^{Space}"
                ToolTip "EN" ; Shift得反着提示,提示切换后的状态。
            } else {
                Send "^{Space}"
                ToolTip "中"
            }
            Sleep 1000
            ToolTip
        }
    }
    ;---------------------------------------------------------------------o
    setIME(language)
    {
        Sleep 50 ; 等一等是为了承接窗口切换的缓冲
        if language == "中文" {
            if (hasIME() = 0) {
                Send "^{Space}"
                ToolTip "中"
            }
        } else if language == "EN" {
            if (hasIME() = 1) {
                Send "^{Space}"
                ToolTip "EN"
            }
        }
        setCaspsLockState "Off"
        Sleep 250 ; 悬浮提示(如有)0.25 秒后消失
        ToolTip
    }
    ;---------------------------------------------------------------------o
    ; IMEの状態の取得
    ;   対象: AHK v2.0.0以升
    ;   WinTitle : 対象Window (省略時:アクティブウィンドウ)
    ;   戻り値  1:ON 0:OFF
    ;---------------------------------------------------------------------o
    hasIME(WinTitle:="A")
    {
        try {
            hWnd := WinGetID(WinTitle)
        } catch (e) {
            ; ^Esc 开始菜单弹窗,会卡死在找不到当前窗口
            return
        }
        DetectHiddenWindows True
        result := SendMessage(
                0x283,  ; Message : WM_IME_CONTROL
                0x005,  ; wParam  : IMC_GETOPENSTATUS
                0,      ; lParam  : (NoArgs)
                ,       ; Control : (Window)
                "ahk_id " DllCall( "imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
                )
        DetectHiddenWindows False
        ; 1 非英文状态
        ; 0 英文状态
        return result
    }
    

    根据二八定律,我们常用软件就只有两个。

    你需要用的,你不得不用的。

    😘 autohotkey V2


    后记

    2021/10/05 更新了 Win11 后,输入法设置被重置,导致两个输入法,快捷键切换失效;其实,只保留 QQ 拼音输入法 一个就行了。如何把 微软拼音 删除呢?

    藏的很深

    这微软拼音挺能藏啊?需要添加键盘召唤出来,再删除。就真的消失了。

    之前删除过,不增加,就看不到它。

    相关文章

      网友评论

          本文标题:AHK 实现中英文输入法自由

          本文链接:https://www.haomeiwen.com/subject/dkjsgltx.html