[AutoHotKey/AHK] 在光标处显示输入法的状态(大小写,中英文)

前言

        更新于2021年12月27日,有不少朋友在使用微软拼音,因此最近两天研究了一下,并放出测试版本,同时优化了一下搜狗拼音的版本。希望大家帮忙测试并给出建议,谢谢。

        可到我的GitHub下载编译好的exe文件 GitHub

        码云地址

        将exe文件创建快捷方式,并放在以下目录中便可以开机自启。

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

1. 适用于搜狗输入法正式版(需要使用AutoHotkey v1版本) 

;功能:中、英、大小写输入状态提示
;环境:win10+搜狗输入法正式版,输入法状态切换用默认的shift键。
;作者:傲慢与偏见zxc
;时间:20211227
 
; 按下 Shift 键切换输入法
; EN-英文, CN-中文, A-Caps On
CN := chr(20013)
EN := chr(33521)
 
~CapsLock::
{
    If GetKeyState("CapsLock","T")
        ToolTip, Caps_On
    Else
        ToolTip, Caps_Off
    SetTimer, RemoveToolTip, -1000
    return
}

Shift::
{
    mainAction("A", EN, CN)
    return
}
 
 ; 鼠标左键按下,且为工形图标,判定为文本输入模式
~LButton::
{
    mainAction("A", CN, EN)
    return
}

; 按下Ctrl键查询当前状态
~Ctrl::
{
    mainAction("A", CN, EN)
    return
}

mainAction(p_caps, p_status1, p_status2)
{
    If  (A_Cursor = "IBeam") 
    {
        If (IME_GET()=1)
        {       
            If GetKeyState("CapsLock","T")
                ToolTip, %p_caps%
            Else
                ToolTip, %p_status1%
        }
        else
        {       
            If GetKeyState("CapsLock","T")
                ToolTip, %p_caps%
            Else
                ToolTip, %p_status2%
        }
    }
    SetTimer, RemoveToolTip, -1000
}

RemoveToolTip:
ToolTip
return
 
IME_GET(WinTitle="")
;-----------------------------------------------------------
; “获得 Input Method Editors 的状态”
;-----------------------------------------------------------
{
    ifEqual WinTitle,,  SetEnv,WinTitle,A
    WinGet,hWnd,ID,%WinTitle%
    DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)
 
    DetectSave := A_DetectHiddenWindows
    DetectHiddenWindows,ON
    SendMessage 0x283, 0x005,0,,ahk_id %DefaultIMEWnd%
    DetectHiddenWindows,%DetectSave%
    Return ErrorLevel
}

2. 适用于微软拼音(需要使用AutoHotkey v2版本) 

(在vscode,notepad++,记事本之间切换会报错,暂未解决,还是建议使用搜狗版本)

;功能:中、英、大小写输入状态提示
;环境:win10+微软拼音,输入法状态切换用默认的shift键。
;作者:傲慢与偏见zxc
;时间:20211227

; 按下 Shift 键切换输入法

 DetectHiddenWindows True
~CapsLock::
{
    If GetKeyState("CapsLock","T")
    {
        ToolTip "Caps_On"
    }     
    Else
    {
        ToolTip "Caps_Off"
    }  
    SetTimer () => ToolTip(), -1000
    return
}

Shift::
{
    ToolTip
    mainAction("A", "英", "中")
    return
}

 ; 鼠标左键按下,且为工形图标,判定为文本输入模式
~LButton::
{
    If  (A_Cursor = "IBeam") 
    {
        mainAction("A", "中", "英")
    } 
    return
}

; 按下Ctrl键查询当前状态(只在工形图标下生效,如果想全局生效,可以把判断条件去掉)
~Ctrl::
{
    If  (A_Cursor = "IBeam") 
    {
        mainAction("A", "中", "英")
    }
    return
}

mainAction(p_caps, p_status1, p_status2){
    If (!isEnglishMode())
    {       
        If GetKeyState("CapsLock","T")
        {
            ToolTip p_caps
        }           
        Else
        {
            ToolTip p_status1
        }          
    }
    else
    {       
        If GetKeyState("CapsLock","T")
            ToolTip p_caps
        Else
            ToolTip p_status2
    }
    SetTimer () => ToolTip(), -1000
}

; 可以用于判断微软拼音是否是英文模式
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")
    )
    ; DetectHiddenWindows Fasle
    ; 返回值是0表示是英文模式,其他值表明是中文模式
    return result == 0
}

### 回答1: 你可以在 Autohotkey 脚本内使用 Reload 函数来重新加载它自己。该函数的语法如下: Reload 使用该函数的示例如下: ^r:: Reload return 上面的示例中,当用户按下 "Ctrl + R" 组合键时,脚本将会重新加载自身。 ### 回答2: AutoHotkey(简称AHK)是一种自动化脚本语言,常用于自动化操作、自定义快捷键等。如果你想要让一个AHK文件在运行时重新加载自己,可以使用以下方法。 首先,在你的AHK脚本中添加一个快捷键绑定,用于触发重新加载。你可以选择任意一个你喜欢的快捷键,比如"Ctrl + Alt + R"。添加以下代码可以实现这个功能: ^!r:: Reload return 第一行代码中的"^"代表Control键,"!"代表Alt键,"r"代表"R"键。所以 "^!r"即为"Ctrl + Alt + R"。第三行的"Reload"命令用于重新加载脚本。 将以上代码添加至你的AHK脚本中,保存修改。 接下来,在你打开的AHK脚本中,按下设置的快捷键"Ctrl + Alt + R"即可重新加载脚本。这样,你就不需要关闭脚本再重新打开它了,可以直接加载修改后的内容。 需要注意的是,重新加载脚本会终止当前脚本的执行,并重新启动脚本。 希望以上解答对你有所帮助。如有其他问题,请随时提问。 ### 回答3: 要让AutoHotkeyAHK)文件重新加载自己,你可以使用AHK内置的Reload函数。Reload函数可以重启当前运行的脚本,即重新加载脚本文件。 你可以在脚本文件的任何位置使用Reload函数来实现重新加载。以下是一个示例: ```autohotkey ^!r:: Reload return ``` 上述代码将Ctrl+Alt+R绑定到Reload函数。当你按下这个组合键时,AHK脚本会重新加载。 如果你想要自动重载脚本,你可以将Reload函数与文件监视器结合使用。文件监视器可以监视脚本文件的任何更改,并在更改后自动重新加载。 以下是一个将文件监视器与Reload函数结合使用的示例: ```autohotkey #Persistent SetTimer, ReloadCheck, 1000 return ReloadCheck: If (FileExist("脚本文件的完整路径")) { FileGetTime, currentModified, 脚本文件的完整路径 If (currentModified != previousModified) { Reload } } previousModified := currentModified return ``` 在上述代码中,我们首先设置了一个持续的定时器(SetTimer),它每秒钟检查一次脚本文件是否有更改。然后,我们使用FileExist和FileGetTime函数来获取脚本文件的最新修改时间,如果最新修改时间与之前保存的修改时间不同,则重新加载脚本。 请注意,你需要将代码中的"脚本文件的完整路径"替换为你实际的脚本文件路径。 这些是使用AutoHotkey重新加载脚本的两种方法。希望对你有帮助!
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值