小工具:中英文输入法切换提示

| |

问题提出

在敲代码写注释,或者编写包含公式的文档的时候,经常需要中英文切换,有时多按或少按了一下Shift,还要看一眼右下角状态栏,就很麻烦,能不能在中英文切换的时候实现类似大小写切换的屏幕显示效果呢?
我搜了一下,找到了一个名叫 AutoHotkey 的工具,来看看。

AutoHotkey介绍

AutoHotkey 是一款 windows 平台下的热键脚本语言程序,能够通过自定义脚本实现一些重复性强没技术含量的自动化操作,例如:重映射键盘、操作窗口、字符串处理、设置快捷键等,而且占用资源极小,仅 3M 大小。有人称它为Windows 自动化效率神器。

可以访问相关资料:初学者向导
参阅:V2官方文档
巨坑提示:autohotkeyV1版本和V2版本完全不兼容!!!!,现在网上还有大量V1的教程,如果我们安装了V2,却使用V1的语法,那就会报错!!!

看看它的语法:

AutoHotkey

;分号是注释的意思

;快捷键 alt + n 打开记事本,感叹号表示alt键,
!n::Run notepad

例程

AutoHotkey

;快捷键 win + space 打开百度网站
#space::Run www.baidu.com

V1例程

AutoHotkey

;按下 win + m 显示一个弹窗,注意这是v1的语法,V2不兼容
#m::
MsgBox, This one too. 
return

例程

AutoHotkey

;按下 ctrl + n 打开记事本
^n::Run Notepad

;快捷键 alt + q 启动位于 D:\software\QQ.exe 的 QQ 程序
!q::Run D:\software\QQ.exe

程序源码及注释

程序逻辑:
输入法状态只有3种情况:小写英文,大写英文,中文。(abc ,ABC,中)

注意,下面的 isEnglishMode() 函数可能不适应于搜狗输入法,可能只适用于微软拼音输入法,如果要使用搜狗拼音输入法,需要改一个参数。

AutoHotkey

#Requires AutoHotkey v2.0
DetectHiddenWindows True

; 定义全局变量用于控制提示窗口
global isShowing := false
global MyGui

; Shift键 - 显示当前模式
Shift::{
    If (!isEnglishMode()) {
        showtext("abc")
    } else {
        showtext("中")
    }
    return
}

; CapsLock键 - 切换大小写并处理中英文模式
CapsLock::{
    If (GetKeyState("CapsLock", "T")) {
        ; 如果CapsLock激活,关闭它并处理中英文模式
        SetCapsLockState 0
        If (!isEnglishMode()) {
            ; 如果当前是中文模式,切换到英文模式
            Send "^{Space}"
            showtext("abc")
        }
    } else {
        ; 否则,激活CapsLock
        SetCapsLockState 1
        showtext("ABC")
    }
    return
}

; 判断当前输入法是否为英文模式
isEnglishMode() {
    hWnd := winGetID("A")
    result := SendMessage(
        0x283, ; WM_IME_CONTROL消息
        0x001, ; 获取转换模式
        0, ; 不需要lParam
        , ; 不指定Control
        "ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
    )
    return result == 0 ; 返回值为0表示英文模式
}

; 显示提示文本
showtext(str) {
    global isShowing, MyGui
    ; 如果当前有提示显示,销毁并创建新的提示
    if (isShowing) {
        MyGui.Destroy()
    }

    y := A_ScreenHeight - 480
    MyGui := Gui("+AlwaysOnTop +Disabled -Caption -SysMenu +Owner +LastFound")
    MyGui.SetFont("s30 c800080 w700", "Verdana")
    WinSetTransparent 100
    MyGui.Add("Text", "BackgroundTrans", str)
    MyGui.Show("NoActivate xCenter NA Y" y)

    ; 设置定时器,在500ms后关闭提示
    isShowing := true
    SetTimer(DestroyTip, 800) ; 使用v2.0语法
}

; 关闭提示窗口
DestroyTip() {
    global isShowing, MyGui
    if (isShowing) {
        MyGui.Destroy()
        isShowing := false
    }
}

更多功能

下面两段代码实现切换到中文模式、切换到小写英文模式的功能:

AutoHotkey

; 右Alt键 - 切换到中文模式
RAlt::{
    If (GetKeyState("CapsLock", "T")) {
        ; 如果CapsLock激活,关闭它
        SetCapsLockState 0
    }

    If (isEnglishMode()) {
        ; 如果当前是英文模式,切换到中文模式
        Send "^{Space}"
        showtext("中")
    } else {
        ; 如果已经是中文模式,仅显示提示
        showtext("中")
    }
    return
}

; 右Ctrl键 - 切换到小写英文模式
RControl::{
    If (GetKeyState("CapsLock", "T")) {
        ; 如果CapsLock激活,关闭它并处理中英文模式
        SetCapsLockState 0
        If (!isEnglishMode()) {
            ; 如果当前是中文模式,切换到英文模式
            Send "^{Space}"
        }
        showtext("abc")
    } else {
        ; 否则,检查当前模式并进行适当的操作
        If (isEnglishMode()) {
            showtext("abc")
        } else {
            ; 如果当前是中文模式,切换到英文模式
            Send "^{Space}"
            showtext("abc")
        }
    }
    return
}

下面的代码实现一些重映射功能:

AutoHotkey

F12::Run "www.weiyeji.com"
;按下f4,输出$
F4::{
    SendText "$"
    return
}

;两个反引号表示一个反引号,这是转义字符
;按下F3输出一个反引号
F3::SendText "``"

实现autohotkey脚本时,务必注意版本问题。