智能软切换输入法

/*
原作者的脚本网址和使用方法介绍 https://faxian.appinn.com/747
我这个脚本改进自该作者,所以先要看原来的说明文档才可以懂

原作者信息如下
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; AHK版本:		1.1.23.01
; 语言:		中文
; 作者:		lspcieee 
; 网站:		http://www.lspcieee.com/
; 脚本功能:	自动切换输入法
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--------------------------------------------------------------------------------------------------------------- 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 脚本名称:IME2_AHK输入法自动/智能切换 v0.3
; 脚本版本号 v0.3
; AHK版本:		1.1.30
; 语言:		中文
; 改编者:	心如止水  
; 脚本功能:	AHK自动切换输入法 Autohotkey自动切换输入法
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 和原作不一样的地方
1,我用的是系统设置输入法快捷键的方法切换
	Sleep 120
	send +^7
	Sleep 120
	send +^8
	Sleep 100
	
	;~ send +^7 是切换我的主输入法之外的"五笔"输入法 切换它的作用主要是"重置主输入法"没有其他作用
	;send +^8 是我的主输入法快捷键(我用的是搜狗)
	
2,我加入了一个日本作者的输入法状态检测程序,更智能(v0.3)
	
;--------------------------------------------------------------------------------------------------------------- 

*/

#SingleInstance force
SetTitleMatchMode RegEx


;借鉴了某日本人脚本中的获取输入法状态的内容,减少了不必要的切换,切换更流畅了
IME_GET(WinTitle="")
;-----------------------------------------------------------
; IMEの状態の取得
;    対象: AHK v1.0.34以降
;   WinTitle : 対象Window (省略時:アクティブウィンドウ)
;   戻り値  1:ON 0:OFF
;-----------------------------------------------------------
{
    ifEqual WinTitle,,  SetEnv,WinTitle,A
    WinGet,hWnd,ID,%WinTitle%
    DefaultIMEWnd := DllCall("imm32ImmGetDefaultIMEWnd", Uint,hWnd, Uint)

    ;Message : WM_IME_CONTROL  wParam:IMC_GETOPENSTATUS
    DetectSave := A_DetectHiddenWindows
    DetectHiddenWindows,ON
    SendMessage 0x283, 0x005,0,,ahk_id %DefaultIMEWnd%
    DetectHiddenWindows,%DetectSave%
    Return ErrorLevel
}



;=====分组配置
;新开窗口时,切换到中文输入法的分组
GroupAdd,cn,ahk_class TXGuiFoundation  ;QQ
GroupAdd,cn,ahk_class HwndWrapper


;新开窗口时,切换到英文输入法的分组
;~ GroupAdd,en,ahk_exe devenv.exe  ;Visual Studio



;窗口切换时,切换到中文输入法
GroupAdd,cn32772,ahk_class TXGuiFoundation  ;QQ
GroupAdd,cn32772,ahk_class HwndWrapper
GroupAdd,cn32772, - 滴答清单 

;窗口切换时,切换到英文输入法
;~ GroupAdd,en32772,ahk_class Listary_WidgetWin_0

;编辑器分组
;~ GroupAdd,editor,ahk_exe devenv.exe  ;Visual Studio
;~ GroupAdd,editor,ahk_exe notepad.exe ;记事本
;~ GroupAdd,editor,ahk_class Notepad++
GroupAdd,editor,ahk_exe idea64.exe
;~ GroupAdd,editor,ahk_class idea.exe




;函数
;从剪贴板输入到界面
sendbyclip(var_string)
{
    ClipboardOld = %ClipboardAll%
    Clipboard =%var_string%
	ClipWait
    send ^v
    sleep 99
    Clipboard = %ClipboardOld%  ; Restore previous contents of clipboard.
}


setChineseLayout(){
	If (IME_GET()=1){
	return
	}
	;~ MsgBox,5
   TrayTip,AHK, 已切换到中文输入法
	;发送中文输入法切换快捷键,请根据实际情况设置。
	Sleep 148
	send {Shift Down}{Ctrl Down}7
	send {Shift Up} {Ctrl Up}
		Sleep 123
	send {Shift Down}^8
	send {Shift Up}
	return

}


setEnglishLayout(){
	If (IME_GET()=2){
	return
	}
	;~ MsgBox,5
	TrayTip,AHK, 已切换到英文输入法
	Sleep 120
	send +^7
	Sleep 120
	send +^8
	Sleep 100
	send {Shift}
	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
		}
	}
}

;在所有编辑器中自动切换中英文输入法
#IfWinActive,ahk_group editor
:*:// ::
	;//加空格 时 切换到中文输入法
	setEnglishLayout()
	sendbyclip("//")
	setChineseLayout()
return

/*

:Z*:///::
	;///注释时 切换到中文输入法(也可以输入///加空格)
	setEnglishLayout()
	sendbyclip("//")
	SendInput /
	setChineseLayout()
return

*/

:*:" ::
	;引号加空格 时 切换到中文输入法
	setEnglishLayout()
	SendInput "
	setChineseLayout()
return
:*:`;`n::
	;分号加回车 时 切换的英文输入法
	setEnglishLayout()
	sendbyclip(";")
	SendInput `n
return
:Z?*:`;`;::
	;两个分号时 切换的英文输入法
	setEnglishLayout()
return
:Z?*:  ::
	;输入两个空格 切换的中文输入法
	setEnglishLayout()
	setChineseLayout()
return

#IfWinActive

给TA捐赠
共{{data.count}}人
人已捐赠
其他

智能解压-没有使用

2020-3-9 3:26:44

其他

更换msgbox上按钮名称

2020-3-9 3:28:44

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索