分享一个自用的AHK输入法切换方案,目前用着还挺不错的,很可能会继续更新
1 /* 2 # 特别注意: 3 1, “监控消息回调”需要放到自动执行段当中 4 2,一定要先看使用说明,由于时间较仓促,没图文并茂的形式,有一点编程基础的,应该会看得懂如何配置。一旦失效了,一般就是这个地方出了问题,因为每个机器那个号可能是不一样的,首先怀疑这一点。 5 6 # 关于原作者: 7 原作者的脚本网址和使用方法介绍 https://faxian.appinn.com/747 8 我这个脚本改进自该作者,所以先要看原来的说明文档才可以懂 9 10 原作者信息如下 11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 12 ; AHK版本: 1.1.29.01 13 ; 语言: 中文 14 ; 作者: lspcieee <lspcieee@gmail.com> 15 ; 网站: http://www.lspcieee.com/ 16 ; 脚本功能: 自动切换输入法 17 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 18 ;--------------------------------------------------------------------------------------------------------------- 19 # 改编者信息: 20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 21 ; 脚本名称:IME2 22 ; 脚本版本号 v1.05 23 ; AHK版本: 1.1.30 24 ; 语言: 中文 25 ; 改编者:心如止水<QQ:2531574300> <Autohotkey高手群(348016704)> 26 ; 脚本功能: 可根据五种不同场景,自动切换输入法 27 ; ^_^: 如果您有什么新的想法,或者有什么改进意见,欢迎加我的QQ,一起探讨改进 :^_^ 28 ; 感谢 无关风月 的帮助,将来还会持续更新优化 29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 30 # 版本信息 31 ## v0.3:在原作基础上增加了检测功能,切换更智能了 32 ## v1.0:9月24日 切换方式暂改为"切换键盘布局",切换更智能,更流畅,几乎不会出错 33 ## v1.01:9月24日 默认停掉编辑器内手动切换 这个非常容易误触,还是采取全局切换的那个比较好,修复了窗口切换时切换输入法失效的问题 34 ## v1.02:9月24日 在 编辑器内/全局手动时 默认停掉提示 35 ## v1.03:9月24日 1,针对中文输入法英文模式的情况,进行了针对性优化(仍需要您手动检测情况,填写代号) 2,输入法切换方法支持忽略延迟 36 ## v1.04:9月25日 1,修复了"中文布局+中文输入法下切换"时,"通知提示消失/忽略延迟不起作用"的问题 2,把注释放到了前面 37 ## v1.05:9月25日 调整注释 38 ;--------------------------------------------------------------------------------------------------------------- 39 ;v1.0使用说明 40 ; ### 切换方法改为更稳定的"切换键盘布局方法",还可以在其它键盘布局上放英文输入法,提高效率(v1.0) 41 ; ### 如何设置键盘布局? 42 可以去百度或谷歌上搜一下(这个在"控制面板→语言→添加语言"中),默认的大概是中文(简体),新增加一个英文(美国) 43 ; ### 如何使用? 44 切换和检测的方法,都需要特定的号码,但是这个号码是不一样的,你需要获取,然后更改 45 1,启用《键盘布局号码 - 手动检测工具》,分别检测你的计算机上两个键盘布局的号码是多少,然后记录下来,根据结果更改中英文切换方法setChineseLayout()&setEnglishLayout()+检测方法IMELA_GET(),务必要全部替换 46 2,另外 启用《输入法中英文代号-手动检测工具》,分别检测你计算机上中英文的输入法状态号码是多少,然后记录下来,根据结果修改一下检测方法IME_GET(WinTitle="") (因为这个版本的原理为切换键盘布局,所以这个在切换方法中没有利用,只需要改检测方法就可以) 47 ; ### 小技巧 48 ; #### 英文输入法 49 英文输入法在打字的时候可以给出英文提示,有点类似于IDE的效果,很多人工作中和英语打交道比较少,偶尔用到之后,发现很多词都忘了,需要翻字典,有了英文输入法这种现象就大大的改善了 50 英文输入法可以用一下Triivi ,口碑还是不错的 51 ; #### 最好设置"为不同窗口,设置不同输入法",这个在"控制面板→语言→高级设置→切换输入法"中,这样能省很多事儿 52 ;--------------------------------------------------------------------------------------------------------------- 53 */ 54 55 #SingleInstance force 56 SetTitleMatchMode 2 57 58 ; # 监控消息回调ShellMessage,并自动设置输入法(监测窗口切换以及打开的方法) 59 Gui +LastFound 60 hWnd := WinExist() 61 DllCall( "RegisterShellHookWindow", UInt,hWnd ) 62 MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" ) 63 OnMessage( MsgNum, "ShellMessage") 64 65 ; # 分组配置 66 ; ## 新开窗口时,切换到中文输入法的分组 67 GroupAdd,cn,ahk_class TXGuiFoundation ;QQ 68 GroupAdd,cn,ahk_exe iThoughts.exe ;思维导图软件 69 GroupAdd,cn, - 滴答清单 ;滴答清单 70 GroupAdd,cn,ahk_exe CmapTools.exe ;概念图软件 71 ;~ GroupAdd,cn,ahk_exe wps.exe ;wps 72 ;~ GroupAdd,cn,ahk_exe MindManager.exe 73 ;~ GroupAdd,cn,ahk_exe iThoughts.exe 74 ; ### 微软三件套 75 ;~ GroupAdd,cn,ahk_class OpusApp ;word 76 ;~ GroupAdd,cn,ahk_class XLMAIN ;Excel 77 78 ; ## 新开窗口时,切换到英文输入法的分组 79 ;~ GroupAdd,en,ahk_exe devenv.exe ;Visual Studio 80 ;~ GroupAdd,en,ahk_exe dopus.exe 81 ;~ GroupAdd,en,ahk_class Notepad++ 82 ;~ GroupAdd,en,ahk_class Listary_WidgetWin_0 83 ;~ GroupAdd,en,ahk_exe Listary.exe 84 85 ; ## 窗口切换时,切换到中文输入法 86 GroupAdd,cn32772,ahk_class TXGuiFoundation ;QQ 87 GroupAdd,cn32772,ahk_exe iThoughts.exe ;思维导图软件 88 GroupAdd,cn32772, - 滴答清单 ;滴答清单 89 /* 90 91 ; ### 用NotePad做一下测试 92 GroupAdd,cn32772,ahk_exe notepad.exe ;NotePad 93 94 */ 95 ;~ GroupAdd,cn32772,ahk_class OpusApp ;word 96 ;~ GroupAdd,cn32772,ahk_class XLMAIN ;Excel 97 98 ; ## 窗口切换时,切换到英文输入法 99 ;~ GroupAdd,en32772,ahk_class Listary_WidgetWin_0 100 ;~ GroupAdd,en32772,ahk_exe Listary.exe 101 102 ; ## 编辑器分组 103 GroupAdd,editor,ahk_exe idea64.exe ;Java-IDEA 104 ;~ GroupAdd,editor,ahk_exe devenv.exe ;Visual Studio 105 ;~ GroupAdd,editor,ahk_exe notepad.exe ;记事本 106 ;~ GroupAdd,editor,ahk_class Notepad++ 107 ;~ GroupAdd,editor,ahk_class SciTEWindow ;SciTE 108 ;~ GroupAdd,editor,ahk_class SunAwtFrame 109 ;~ GroupAdd,editor,ahk_class idea.exe 110 111 /* 112 113 ; ### 用NotePad做一下测试 114 GroupAdd,editor,ahk_exe notepad.exe ;NotePad 115 116 */ 117 ;~ GroupAdd,editor,ahk_exe WINWORD.EXE ;word 118 119 120 /* 121 122 ;键盘布局号码 - 手动检测工具 123 ; 检测方法以及切换思路来自 https://autohotkey.com/board/topic/18343-dllcall-loadkeyboardlayout-problem/ 124 F11:: 125 SetFormat, Integer, H 126 WinGet, WinID,, A 127 ThreadID:=DllCall("GetWindowThreadProcessId", "UInt", WinID, "UInt", 0) 128 InputLocaleID:=DllCall("GetKeyboardLayout", "UInt", ThreadID) 129 MsgBox, %InputLocaleID% 130 Return 131 */ 132 133 ; # 激活窗口键盘布局检测方法,减少了不必要的切换,切换更流畅了 134 IMELA_GET(){ 135 SetFormat, Integer, H 136 WinGet, WinID,, A 137 ThreadID:=DllCall("GetWindowThreadProcessId", "UInt", WinID, "UInt", 0) 138 InputLocaleID:=DllCall("GetKeyboardLayout", "UInt", ThreadID) 139 ;~ MsgBox, %InputLocaleID% 140 return %InputLocaleID% 141 } 142 143 ; # 借鉴了某日本人脚本中的获取输入法状态的内容,减少了不必要的切换,切换更流畅了 144 ; # 每个人的机器是不一样的,请使用下面的检测工具自己测试 145 IME_GET(WinTitle="") 146 ;----------------------------------------------------------- 147 ; IMEの状態の取得 148 ; 対象: AHK v1.0.34以降 149 ; WinTitle : 対象Window (省略時:アクティブウィンドウ) 150 ; 戻り値 1:ON 0:OFF 151 ;----------------------------------------------------------- 152 { 153 ifEqual WinTitle,, SetEnv,WinTitle,A 154 WinGet,hWnd,ID,%WinTitle% 155 DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint) 156 157 ;Message : WM_IME_CONTROL wParam:IMC_GETOPENSTATUS 158 DetectSave := A_DetectHiddenWindows 159 DetectHiddenWindows,ON 160 SendMessage 0x283, 0x005,0,,ahk_id %DefaultIMEWnd% 161 DetectHiddenWindows,%DetectSave% 162 Return ErrorLevel 163 } 164 165 /* 166 167 ; # 输入法中英文代号-手动检测工具 168 ::`;ce:: 169 MsgBox,% IME_GET() 170 return 171 172 */ 173 174 ; # 全局手动切换方法 175 ::`;sv:: 176 setChineseLayout() 177 return 178 ::`;sy:: 179 setEnglishLayout() 180 return 181 ; # 中文简体键盘布局切换主方法 182 ; 默认s=0关闭提示,s=1为打开提示;h=0忽略延迟,h=1打开默认延迟 183 setChineseLayout(s=0,h=1){ 184 ;~ /* 185 186 ;智能检测,如果发现已经是中文,则不切换 187 If (IMELA_GET()=0x8040804) { 188 ;~ MsgBox,发现已经是中文--不切换 189 ;如果发现虽然是中文的键盘布局,但切换到了内置英文模式,那么也是要改的,改的方法很简单粗暴,切成英文,再切成中文,如果你有快捷键也可以用,但不一定比这个更稳 190 If (IME_GET()=0){ 191 ;~ MsgBox,% h 192 if (h=1){ 193 Sleep,30 194 } 195 PostMessage, 0x50,, 0x4090409,, A 196 if (h=1){ 197 Sleep,30 198 } 199 PostMessage, 0x50,, 0x8040804,, A 200 if (s=1){ 201 TrayTip,AHK, 已切换到中文输入法 202 } 203 return 204 } 205 return 206 } 207 208 ;~ */ 209 if (h=1){ 210 Sleep,120 211 } 212 213 PostMessage, 0x50,, 0x8040804,, A 214 if (h=1){ 215 Sleep,35 216 } 217 if (s=1){ 218 TrayTip,AHK, 已切换到中文输入法 219 } 220 221 return 222 } 223 224 ; # 英文美国键盘布局切换主方法 225 ; 默认s=0关闭提示,s=1为打开提示;h=0忽略延迟,h=1打开默认延迟 226 setEnglishLayout(s=0,h=1){ 227 ;~ /* 228 229 ;智能检测,如果发现已经是英文,则不切换 230 If (IMELA_GET()=0x4090409){ 231 ;~ MsgBox,发现已经是英文--不切换 232 return 233 } 234 235 ;~ */ 236 if (h=1){ 237 Sleep,120 238 } 239 PostMessage, 0x50,, 0x4090409,, A 240 if (h=1){ 241 Sleep,35 242 } 243 if (s=1){ 244 TrayTip,AHK, 已切换到英文输入法 245 } 246 247 return 248 } 249 250 251 ShellMessage( wParam,lParam ) { 252 253 ;1 顶级窗体被创建 254 ;2 顶级窗体即将被关闭 255 ;3 SHELL 的主窗体将被激活 256 ;4 顶级窗体被激活 257 ;5 顶级窗体被最大化或最小化 258 ;6 Windows 任务栏被刷新,也可以理解成标题变更 259 ;7 任务列表的内容被选中 260 ;8 中英文切换或输入法切换 261 ;9 显示系统菜单 262 ;10 顶级窗体被强制关闭 263 ;11 264 ;12 没有被程序处理的APPCOMMAND。见WM_APPCOMMAND 265 ;13 wParam=被替换的顶级窗口的hWnd 266 ;14 wParam=替换顶级窗口的窗口hWnd 267 ;&H8000& 掩码 268 ;53 全屏 269 ;54 退出全屏 270 ;32772 窗口切换 271 If ( wParam = 1 ) 272 { 273 Sleep, 1000 274 IfWinActive,ahk_group cn 275 { 276 setChineseLayout(1) 277 return 278 } 279 IfWinActive,ahk_group en 280 { 281 setEnglishLayout(1) 282 return 283 } 284 } 285 If ( wParam = 32772 ) 286 { 287 IfWinActive,ahk_group cn32772 288 { 289 setChineseLayout(1) 290 return 291 } 292 IfWinActive,ahk_group en32772 293 { 294 setEnglishLayout(1) 295 return 296 } 297 } 298 } 299 300 ; # 在所有编辑器中自动切换中英文输入法 301 302 /* 303 ## 切换逻辑简述(该逻辑适用于Java以及C#,如果您使用的是其他语言,需要针对性修改) 304 305 分为自动场景和手动场景 306 307 中文自动切换场景:1,输入单行注释时,按下空格,切换为中文,便于加汉语注释 2,输入引号时,按下空格切换为中文,便于添加中文字符串 (当然你也可以不按空格,那就是英文,不会改) 308 英文自动切换场景: 输入分号加回车,在Java中这代表切换到下一个语句,所以默认重置为英文 309 310 中英文手动切换方法:1,全局方法是热字串;sv(中文);sy(英文) 311 2,[v1.01默认关闭] 在编辑器中继承之前的逻辑,自动切换时中文需要按下空格,在这里连续按下两个空格,是切换中文,自动切换时,英文需要按下分号加回车,这里按下两个分号,为手动切换。手动切换时不会有任何的残留,自动切换,由于是配合场景,会留下这场景所需的符号(比如注释符号和引号)。 312 */ 313 314 ; # 编辑器内输入法切换方案 315 #IfWinActive,ahk_group editor 316 :*:// :: 317 ;//加空格 时 切换到中文输入法 318 ;~ setEnglishLayout() 319 sendbyclip("//") 320 setChineseLayout() 321 return 322 323 /* 324 ; C# 专用注释方法 Java中没有 所以我给注释掉了 325 :Z*:///:: 326 ;///注释时 切换到中文输入法(也可以输入///加空格) 327 setEnglishLayout() 328 sendbyclip("//") 329 SendInput / 330 setChineseLayout() 331 return 332 333 */ 334 335 :*:" :: 336 ;引号加空格 时 切换到中文输入法 337 ;~ setEnglishLayout() 338 SendInput " 339 setChineseLayout() 340 return 341 342 :*:`;`n:: 343 ;分号加回车 时 切换的英文输入法 344 setEnglishLayout() 345 sendbyclip(";") 346 SendInput `n 347 return 348 349 /* 350 351 ; ## 编辑器内输入法手动切换 352 :Z?*:`;`;:: 353 ;两个分号时 切换的英文输入法 354 setEnglishLayout() 355 return 356 :Z?*: :: 357 ;输入两个空格 切换的中文输入法 358 ;~ setEnglishLayout() 359 setChineseLayout() 360 return 361 362 */ 363 364 #If 365 366 367 ;函数 368 ;从剪贴板输入到界面 369 sendbyclip(var_string) 370 { 371 ClipboardOld = %ClipboardAll% 372 Clipboard =%var_string% 373 ClipWait 374 send ^v 375 sleep 99 376 Clipboard = %ClipboardOld% ; Restore previous contents of clipboard. 377 } 378 379 ; #设置重启当前脚本的热字串 ;rl 380 #If WinActive(A_ScriptName) 381 ;###保存并重启当前脚本 382 :?:;rl:: 383 Sleep 25 384 send ^s 385 Sleep 25 386 Reload 387 return 388 #If