发表回复 
输入法 演示 V1.6
2015-09-10, 21 : 30 (这个帖子最后修改于: 2015-11-14 18 : 55 by robertL.)
Smile 输入法 演示 V1.6
  • 适用于:仅安装搜狗拼音。(易于改造)
  • 功能:
    • 切换键:使用Shift切换中英文状态,使用CapsLock切换英文大写/英文小写状态。
      切换模式为:英文(含大写)←Shift→中文;英文大写—CapsLock(关闭)→英文小写,中文/英文小写—CapsLock(打开)→英文大写。
      仅单击切换键时有效。
    • 技巧不用关注前一个状态
      CapsLock+Shift后总是中文;CapsLock+Shift×2Shift+CapsLock×2后总是小写英文;Shift+CapsLock总是大写。
    • 原生的模式为:
      • 任意触发切换键,将执行切换中文状态功能。如,按住Shift画规则图形组合键时,均为切换。
      • 切换顺序:要关注前一个状态,总之就是乱
        • 中英文切换键:小写英文—中英文切换键→中文、大写英文—中英文切换键→前一个状态(中文/英文)、中文—中英文切换键→小写英文
        • 大小写切换键:大写←大小写切换键→前一个状态(中文/英文)
  • 输入法功能模块(其中的参数需依据输入法调整)
    代码: (全选)
    ;输入法 V1
    ;http://ahk8.com/thread-5785-post-33734.html
    ;robertL
    class 输入法 extends 输入法.ActionEntrance{
        class ActionEntrance{
            __Call(methodName,winTitle:=""){
                static IMC_GETOPENSTATUS:=0x0005    ;https://msdn.microsoft.com/zh-cn/security/ee491579
                    ,IMC_SETOPENSTATUS:=0x0006
                    ,IMC_SETCONVERSIONMODE:=0x002
                    ,IMC_GETCONVERSIONMODE:=0x001
                    ,IMC_GETSENTENCEMODE:=0x003
                    ,IMC_SETSENTENCEMODE:=0x004
                    ,ActionEntrance_Handle:={中文:[IMC_SETCONVERSIONMODE,0x10000401],英文:[IMC_SETCONVERSIONMODE,0x10000000],开:[IMC_SETSENTENCEMODE,0],关:[IMC_SETSENTENCEMODE,8],状态:[IMC_GETCONVERSIONMODE,0]}
                        ;适用于搜狗输入法
                return 输入法.ActionEntrance.ActionHandle(ActionEntrance_Handle[methodName].1,ActionEntrance_Handle[methodName].2,输入法.ActionEntrance.GethWND(winTitle))
            }
            ActionHandle(wParam,lParam,hWindow){
                static WM_IME_CONTROL:=0x0283    ;https://msdn.microsoft.com/en-us/library/windows/desktop/dd374135(v=vs.85).aspx
                hMIC:=DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow)    ;https://msdn.microsoft.com/en-us/library/windows/desktop/dd318561(v=vs.85).aspx            
                return DllCall("SendMessage", UInt, hMIC, UInt, WM_IME_CONTROL,  Int, wParam,  Int, lParam)
            }
            GethWND(winTitle:=""){
                if(!winTitle)
                    winTitle:="ahk_id " WinExist("A")
                ControlGet,hwnd,HWND,,,%winTitle%
                if  (WinActive(winTitle))   {
                    ptrSize := !A_PtrSize ? 4 : A_PtrSize
                    VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
                    NumPut(cbSize, stGTI,  0, "UInt")  ;   DWORD   cbSize;
                    hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
                             ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
                            ;8+PtrSize对应线程中的激活的窗口。
                }
                return hwnd
            }
        }
        中英文状态(winTitle:=""){
            if(0x401 & 状态:=输入法.状态())
                中英文状态:="中文"
            else
                中英文状态:="英文"
            return 中英文状态
        }
        切换中英文(winTitle:=""){
            ;大写视为英文,将被切换为中文。
            中英文状态:=输入法.中英文状态(winTitle)
            if(GetKeyState("CapsLock","T")){
                SetCapsLockState,Off
                输入法.中文(winTitle)
            }else if(中英文状态="中文")
                输入法.英文(winTitle)
            else
                输入法.中文(winTitle)
        }
    }
  • 输入法功能模块使用方法:
    代码: (全选)
    #include 输入法.ahk
    输入法.中文() ;切换至中文,类似的有"英文"、"开"、"关"。
    输入法.中英文状态() ;返回"中文"、"英文"
    输入法.切换中英文()

  • 演示功能:
    含:切换至不同窗口时,使用一致的默认输入法状态——英文。(可改造为各个窗口使用各自的默认状态,或,所有窗口延续相同的状态)
    窗口变动消息监听-响应,输入法切换热键。
    代码: (全选)
    ;输入法 V1
    ;http://ahk8.com/thread-5785-post-33734.html
    ;robertL
    #include 输入法.ahk
    DllCall("RegisterShellHookWindow", UInt,A_ScriptHwnd )
    OnMessage(DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" ), "ShellHookProc" )
    OnExit("DeregisterShellHookWindow")

    DeregisterShellHookWindow(){
        DllCall("DeregisterShellHookWindow ", UInt,A_ScriptHwnd )
    }
    ShellHookProc(wParam, lParam){
        if(wParam!=4)    ;4: WINDOWACTIVATED
            return
        输入法.英文()
    }

    goto 输入法
    #If    ;{切换中英文
    ~$Shift::
        KeyWait, Shift, T0.2
        if !ErrorLevel{
            输入法.切换中英文()
            ;使中文模式下已输入的内容作为英文插入。
            if(WinExist("ahk_class SoPY_Comp"))
                Send {Enter}
        }else
            KeyWait, Shift
            ;等待释放,避免本热键过程结束后,按键仍保持时系统自动重击键。
        return
    ;~ 其他热键方式:
    ;~ #if A_PriorHotkey="~$Shift" && A_TimeSincePriorHotkey>30 && A_TimeSincePriorHotkey<130
    ;~ ~Shift up::输入法.切换中英文()
    ;}
    ~$CapsLock::
        if(!GetKeyState("CapsLock","T"))
            输入法.英文()
        提示输入状态()
        return
    输入法:
    {}
  • 附加功能参考——提示输入状态
    代码: (全选)
    ;http://ahk8.com/thread-5785-post-33734.html
    ;robertL
    提示输入状态(){
        if(GetKeyState("CapsLock","T"))
            输入状态:="大写"
        else
            输入状态:=输入法.中英文状态()
        ToolTip % 输入状态, A_CaretX, A_CaretY+20, 9
        MouseGetPos, x, y
        ToolTip % 输入状态, x, y+15, 8
        SetTimer, 提示输入状态, -1000
        return
    提示输入状态:
        ToolTip,,,,9
        ToolTip,,,,8
        return
    }
    可以通过GetGUIThreadInfo修正光标位置A_CaretX/A_CaretY不够准确)(参见以下《输入法切换方法不完全小结》)
  • 参见:

One for all, but man for himself

帮推广:AHK知乎专栏
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢robertL
2015-09-11, 23 : 10
RE: 输入法 演示 V1.3
标记下。以前在scite里面干过类似的,但是都忘了……
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢兔子
2015-09-15, 19 : 07
RE: 输入法 演示 V1.4
@兔子 所以要记下来。
要不当时的发现最后都变成了曾经...但却然并卵了...

One for all, but man for himself

帮推广:AHK知乎专栏
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2015-09-26, 15 : 36
RE: 输入法 演示 V1.5
萝卜居然也用中文写代码,不错,支持一个!!
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢td3zz
2015-09-26, 15 : 38
RE: 输入法 演示 V1.5
(2015-09-26 15 : 36)td3zz 提到:  萝卜居然也用中文写代码,不错,支持一个!!
因为不会|找不到贴切的英文,用拼音岂不太掉价了Big Grin

One for all, but man for himself

帮推广:AHK知乎专栏
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2017-08-30, 15 : 59 (这个帖子最后修改于: 2017-09-05 15 : 00 by xphbsy.)
RE: 输入法 演示 V1.6
请问“输入法功能模块使用方法”中的“输入法.ahk”指的是“输入法功能模块(其中的参数需依据输入法调整)”中的代码吗?我是初学者,希望大神能指点一下哈。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2017-09-07, 17 : 05 (这个帖子最后修改于: 2017-09-07 17 : 12 by xphbsy.)
RE: 输入法 演示 V1.6
我现在运行这个脚本时不管当前处于输入法的中文还是英文状态,“中英文状态()”方法的返回值都是“中文”,不知是脚本有问题还是我这里的问题。我就是用以下很简单的代码​测试的:
代码: (全选)
#v::
state := 输入法.中英文状态()
MsgBox 当前中英文状态为:%state%
return
所以我的问题是:
1,我的系统是Windows10 64位。AutoHotkey的版本是v1.1.23.05,请问是否必须用最新版呢?
2,我用SciTE4AutoHotkey调试时Output面板输出了以下内容:
引用:>"C:\Program Files\AutoHotkey\AutoHotkey.exe" /ErrorStdOut "D:\临时\ime.ahk"
>请求的操作需要提升。
可是我已经是用管理员身份运行的SciTE4AutoHotkey和脚本了,这里要如何处理才能调试呢?
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合