用Autohotkey建立自己的输入法

原文地址,可以看出AutoHotkey开发一个输入法是多么的迅速,且代码量不大(不足200行)

#Include wubi86.ahk

;{{{ 透明窗口srf_icon
SplashImage, Splash.png,b X220 Y400 ,,,srf_icon,  ;创建一个图片窗口
WinSet, Transparent, 0 , srf_icon,    ;窗口完全透明
WinSet, TransColor, #0, srf_icon      ; 透明色
WinSet, ExStyle, +0x20, srf_icon,     ;允许鼠标穿透
WinSet, AlwaysOnTop, On , srf_icon,   ;窗口置顶
;}}}

lshift & Lbutton::send +{Lbutton}                                         
;{{{ Lshift键切换模式
Lshift::
    srf_mode := !srf_mode
    if  srf_mode {
        WinSet, Transparent, 250 , srf_icon,
        WinSet, TransColor, #0, srf_icon      ; 透明色
    }
    else
        WinSet, Transparent, 0 , srf_icon,
return
;}}}

;{{{ StrLen(srf_all_input)=4 模式
#if StrLen(srf_all_input)=4
    a::
    b::
    c::
    d::
    e::
    f::
    g::
    h::
    i::
    j::
    k::
    l::
    m::
    n::
    o::
    p::
    q::
    r::
    s::
    t::
    u::
    v:: 
    w::
    x::
    y::
    z::
    send %srf_for_select_array1%
    gosub srf_value_off
    srf_all_input := srf_all_input . A_ThisHotkey
    gosub srf_tooltip
    return
#if
;}}}

;{{{ srf_for_select_array0模式 空格、逗号、句号 定义
#if srf_for_select_array0
    space::srf_select(1)
    ,::srf_select(2)
    .::srf_select(3)
#if
;}}}

;{{{ srf_all_input模式 backspace键、esc键、enter键、Lshift键 定义
;在未完成一个字的输入前,可以删除输入的按键,取消输入,确定输入
#if srf_all_input
    ;{{{ backspace定义
    backspace::  ; 删除前一个输入的字符,如果没有字符了,就关闭提示
      srf_all_input := SubStr(srf_all_input, 1, -1)
      if srf_all_input =
        gosub srf_value_off
      else
        gosub srf_tooltip
    return
    ;}}}

    esc::gosub srf_value_off

    enter::  ; 回车键,把输入的字符发送出来,继续输入法
      send %srf_all_input%
      gosub srf_value_off
    return

    Lshift::  ; 左shift,把输入的字符发送出来,关闭输入
      send %srf_all_input%
      gosub srf_value_off
      WinSet, TransColor, FF0000  0 , srf_icon,
      srf_mode =
    return

#if
;}}}

;{{{ srf_mode模式 a-z键、esc键、中文符号 定义
#if srf_mode
    ;{{{ a-z定义
    a::
    b::
    c::
    d::
    e::
    f::
    g::
    h::
    i::
    j::
    k::
    l::
    m::
    n::
    o::
    p::
    q::
    r::
    s::
    t::
    u::
    v::                                                      
    w::
    x::
    y::
    z::
    srf_all_input := srf_all_input . A_ThisHotkey
    gosub srf_tooltip
    return
    ;}}}

    esc::
        WinSet, TransColor, FF0000  0 , srf_icon,
        srf_mode = 
    return

    ,::send {,}
    .::send {。}

    +;::send {:}
    +'::send {“}{”}{left}
#if                                                                  
;}}}

;{{{ 函数 srf_select
srf_select(list_num)
{
    global 
    sendinput % srf_for_select_array%list_num%                                
    gosub srf_value_off
}
;}}}

;{{{ 标签srf_tooltip
srf_tooltip:
    tooltip, % srf_all_input . "`n[" . %srf_all_input% . "]", A_CaretX + 10 , A_CaretY + 20, 16         
    StringSplit, srf_for_select_array, %srf_all_input%, %A_Space%, %A_Space%

    if (StrLen(srf_all_input)=4 and %srf_all_input%="")    ;四码时,如果无候选,则自动清空编码
        gosub srf_value_off
    else if (StrLen(srf_all_input)=4 and srf_for_select_array0=1)   ;四码时,如果候选唯一,则自动上屏
      {
        send %srf_for_select_array1%
        gosub srf_value_off
      } 
return
;}}}

;{{{ 标签 srf_value_off
srf_value_off:
    srf_for_select_array0=
    tooltip, , , ,16
    srf_all_input=
return
;}}}

;{{{ 自动reload
#IfWinActive,AutoHotkeyU32.ahk
    ~^s::
        sleep 200
        reload
        return
#IfWinActive
;}}}