/* ;--------------------------------------------------------------------------------------------------------------- ########## 我发现的中英文输入法自动(智能)切换的三个方案(Win10下AHK实现方法) ########## 方案1: 源代码和介绍 https://faxian.appinn.com/747 我的改进型叫IME2.ahk(贴在注释后面了) ;~ 我只是改动了快捷键的切换方法,其他的没改,所以先要看原来的说明文档才可以懂 ;--------------------------------------------------------------------------------------------------------------- 说明一下 我用的是系统设置输入法快捷键的方法切换 Sleep 120 send +^7 Sleep 120 send +^8 Sleep 100 ;~ send +^7 是切换我的主输入法之外的"五笔"输入法 切换它的作用主要是"重置主输入法"没有其他作用 ;send +^8 是我的主输入法快捷键(我用的是搜狗) ;--------------------------------------------------------------------------------------------------------------- 方法2: http://www.autoahk.com/archives/1262:莫邪剑Habit 这个是群主(河许人)出的教程,我还没看,刚发现 ;--------------------------------------------------------------------------------------------------------------- 方案3:用AutoHotkey辅助切换中英文标点和智能切换中英文输入法 https://blog.csdn.net/teshorse/article/details/5754732 也还没看 看起来主要是解决标点问题 ;--------------------------------------------------------------------------------------------------------------- */ ;是否允许脚本的多个实例运行 ;单词 FORCE 会跳过对话框并自动替换旧实例, 效果类似于 Reload 命令. #SingleInstance force ;~ ;在任意位置进行匹配: 默认情况下, 正则表达式可以匹配被搜索字符串的 任意位置 的子字符串. 例如, 正则表达式 abc 可以匹配 abc123, 123abc 以及 123abcxyz ;开启之后和Ditto冲突 ;~ SetTitleMatchMode RegEx SetTitleMatchMode,2 ; 默认好像是匹配开头 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; AHK版本: 1.1.23.01 ; 语言: 中文 ; 作者: lspcieee; 网站: http://www.lspcieee.com/ ; 脚本功能: 自动切换输入法 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;开启之后和自动替换冲突 ;~ #IfWinActive,IME_复活版_切换逻辑为自定义快捷键_稳定版备份 ;~ ;###保存并重启当前脚本 ;~ ::`;rl:: ;~ { ;~ Sleep 25 ;~ send ^s ;~ Sleep 25 ;~ Reload ;~ Sleep 1000 ; 如果成功, 则 reload 会在 Sleep 期间关闭这个实例, 所以下面这行语句永远不会执行. ;~ MsgBox, 4,, The script could not be reloaded. Would you like to open it for editing? ;~ IfMsgBox, Yes, Edit ;~ return ;~ } ;~ #IfWinActive ;=====分组配置 ;#新开窗口时,切换到中文输入法的分组 GroupAdd,cn,ahk_class TXGuiFoundation ;QQ ;~ GroupAdd,cn,ahk_exe wps.exe ;wps ;##思维导图和概念图 ;~ GroupAdd,cn,ahk_exe MindManager.exe GroupAdd,cn,ahk_exe CmapTools.exe GroupAdd,cn,ahk_exe iThoughts.exe ;~ GroupAdd,cn,ahk_class HwndWrapper GroupAdd,cn,滴答清单 ;~ GroupAdd,cn,ahk_exe Listary.exe ;##微软三件套 ;~ GroupAdd,cn,ahk_class OpusApp ;word ;~ GroupAdd,cn,ahk_class XLMAIN ;Excel ;#窗口切换时,切换到中文输入法 GroupAdd,cn32772,ahk_class TXGuiFoundation ;QQ GroupAdd,cn32772,ahk_exe iThoughts.exe GroupAdd,cn32772,滴答清单 ;~ GroupAdd,cn32772,ahk_exe Listary.exe ;~ GroupAdd,cn32772,ahk_class OpusApp ;word ;~ GroupAdd,cn32772,ahk_class XLMAIN ;Excel ;#新开窗口时,切换到英文输入法的分组 ;~ GroupAdd,en,ahk_exe devenv.exe ;Visual Studio ;~ GroupAdd,en,ahk_exe dopus.exe ;~ GroupAdd,en,ahk_class Notepad++ ;~ GroupAdd,en,ahk_exe happyheart2.exe ;#窗口切换时,切换到英文输入法 ;编辑器分组 ;只有IDEA,因为这个就是为Java专门设计的,其他的专门优化得了 GroupAdd,editor,ahk_exe idea64.exe ;~ GroupAdd,editor,ahk_exe devenv.exe ;Visual Studio ;~ GroupAdd,editor,ahk_exe notepad.exe ;记事本 ;~ GroupAdd,editor,ahk_class Notepad++ ;~ GroupAdd,editor,ahk_class SciTEWindow ;SciTE ;~ GroupAdd,editor,ahk_class SunAwtFrame ;~ GroupAdd,editor,ahk_class idea.exe ;用WORD做一下测试 ;~ GroupAdd,editor,ahk_exe WINWORD.EXE ;word ;函数 ;从剪贴板输入到界面 sendbyclip(var_string) { ClipboardOld := ClipboardAll Sleep 50 Clipboard := var_string ClipWait send ^v sleep 50 Clipboard = %ClipboardOld% ; Restore previous contents of clipboard. } ;~ setChineseLayout(){ ;~ ;发送中文输入法切换快捷键,请根据实际情况设置。 ;~ Sleep 250 ;~ send +^9 ;~ Sleep 30 ;~ send +^5 ;~ Sleep 5 ;~ return ;~ } ;~ ;慢速版,兼容性好 setChineseLayout(){ ;发送中文输入法切换快捷键,请根据实际情况设置。 Sleep 150 send {Shift Down}{Ctrl Down}7 send {Shift Up} {Ctrl Up} Sleep 125 send {Shift Down}^8 send {Shift Up} } setEnglishLayout(){ Sleep 120 send +^7 Sleep 120 send +^8 Sleep 100 send {Shift} } ;~ ;快速版,禁用Excel+Word的自动切换后很适合 ;~ setChineseLayout(){ ;~ ;发送中文输入法切换快捷键,请根据实际情况设置。 ;~ Sleep 30 ;~ send {Shift Down}{Ctrl Down}7 ;~ send {Shift Up} {Ctrl Up} ;~ Sleep 30 ;~ send {Shift Down}^8 ;~ send {Shift Up} Sleep 1 return ;~ } ;~ setEnglishLayout(){ ;~ Sleep 30 ;~ send +^7 ;~ Sleep 30 ;~ send +^8 ;~ Sleep 15 send ^{Space} ;~ send {Shift} Sleep 5 return ;~ } ;监控消息回调ShellMessage,并自动设置输入法 Gui +LastFound hWnd := WinExist() DllCall( "RegisterShellHookWindow", UInt,hWnd ) MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" ) OnMessage( MsgNum, "ShellMessage") ShellMessage( wParam,lParam ) { ;1 顶级窗体被创建 ;2 顶级窗体即将被关闭 ;3 SHELL 的主窗体将被激活 ;4 顶级窗体被激活 ;5 顶级窗体被最大化或最小化 ;6 Windows 任务栏被刷新,也可以理解成标题变更 ;7 任务列表的内容被选中 ;8 中英文切换或输入法切换 ;9 显示系统菜单 ;10 顶级窗体被强制关闭 ;11 ;12 没有被程序处理的APPCOMMAND。见WM_APPCOMMAND ;13 wParam=被替换的顶级窗口的hWnd ;14 wParam=替换顶级窗口的窗口hWnd ;&H8000& 掩码 ;53 全屏 ;54 退出全屏 ;32772 窗口切换 If ( wParam = 1 ) { ;WinGetclass, WinClass, ahk_id %lParam% ;MsgBox,%Winclass% Sleep, 1000 ;WinActivate,ahk_class %Winclass% ;WinGetActiveTitle, Title ;MsgBox, The active window is "%Title%". IfWinActive,ahk_group cn { setChineseLayout() ;~ TrayTip,AHK, 已自动切换到中文输入法 return } IfWinActive,ahk_group en { setEnglishLayout() ;~ TrayTip,AHK, 已自动切换到英文输入法 return } } If ( wParam = 32772 ) { IfWinActive,ahk_group cn32772 { setChineseLayout() ;TrayTip,AHK, 已自动切换到中文输入法 return } IfWinActive,ahk_group en32772 { setEnglishLayout() ;TrayTip,AHK, 已自动切换到英文输入法 return } } } ;~ ;## 成对符号匹配(自动补全括号) ;~ :*:(::(){left} ;~ :*:[::[]{left} ;~ :*:[:: ;~ setChineseLayout() ;~ return ;~ :*:"::""{left} ;~ :*:'::''{left} ;~ :*:{::{{}{}}{left} ;在所有编辑器中自动切换中英文输入法 #IfWinActive,ahk_group editor :*:// :: ;//加空格 时 切换到中文输入法 ;~ setEnglishLayout() sendbyclip("//") setChineseLayout() return :*:" :: ;引号加空格 时 切换到中文输入法 ;~ setEnglishLayout() SendInput " setChineseLayout() return :*:`;`n:: ;分号加回车 时 切换的英文输入法 setEnglishLayout() sendbyclip(";") SendInput `n return :Z?*:`;`;:: ;两个分号时 切换的英文输入法 setEnglishLayout() return :Z?*: :: ;输入两个空格 切换的中文输入法 ;~ setEnglishLayout() setChineseLayout() return #IfWinActive