[AHK] 分享一段让微软日语输入法首次切换后变成平假名输入模式的 ahk v2脚本

前言

对于多语言输入法+美式英语键盘使用者而言,使用微软日语输入法简直就是噩梦。因为首次切换微软日语输入法会默认切成英文输入模式,还要手动切换平假名模式才能正常输入日语。

这个脚本的作用是每次用 win+空格切换到日语输入法的时候会自动切换到平假名模式。

考虑网络上分享的 ahk 脚本大多数是 v1 版本的,而且实现的方案有点太粗暴了(虽然我这个脚本也很垃圾就是了),如果有更好的解决方案欢迎分享!

具体代码

; 获取当前键盘的虚拟键码的函数
GetKeyboardLanguage(_hWnd := 0)
{
    if (!_hWnd)
        ThreadId := 0
    else
        if !(ThreadId := DllCall("user32.dll\GetWindowThreadProcessId", "Ptr", _hWnd, "UInt", 0, "UInt"))
            return false
    
    if !(KBLayout := DllCall("user32.dll\GetKeyboardLayout", "UInt", ThreadId, "UInt"))
        return false
    
    return KBLayout & 0xFFFF
}

; Win+Space 切换语言自动切换假名模式
#Space:: {
    ; 记录切换前的语言
    prevLanguage := GetKeyboardLanguage(WinExist("A"))
    
    ; 发送 Win+Space 切换语言
    Send "#{Space}"
    
    ; 等待语言切换完成
    startTime := A_TickCount
    Loop {
        ; 检查当前语言
        currentLanguage := GetKeyboardLanguage(WinExist("A"))
        
        ; 如果语言已变化,跳出循环
        if (currentLanguage != prevLanguage)
            break
            
        ; 如果超过2秒还没变化,避免无限循环
        if (A_TickCount - startTime > 2000)
            break
            
        Sleep 50 ; 短暂暂停再检查
    }
    
    ; 如果切换后是日语(1041),发送 Ctrl+CapsLock
    if (currentLanguage = 1041) {
        Send "^{CapsLock}"
    }
}