参考了https://github.com/WwwZMing/IMEAutoSwitch_V2
他的逻辑判断还是太复杂,而且偶尔会报错,浏览器输入经常会切换错误,原版KBLAutoSwitch已经停更
而且既然已经用上ahk,再开一个ahk编写的KBLAutoSwitch觉得怪怪的,于是自己精简一段出来:
我电脑上只安装一个中文输入法,逻辑比较简单:
Auto_Switch := 1
; 监听窗口切换输入法
if (Auto_Switch = 1) {
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "Str", "SHELLHOOK"), shellMessage)
}
; 接受系统窗口回调消息切换输入法
shellMessage(wParam, lParam,*) {
if (wParam = 1 || wParam = 32772 || wParam = 5 || wParam = 4) {
SetTimer IMESwitch, -200
}
}
; 根据激活窗口切换输入法
IMESwitch() {
static toggle := 1
Critical("On")
if(WinActive("ahk_group cnen") && toggle) {
setIME(0) ; 切换中文输入法英文状态
toggle := 0
} else
if(!WinActive("ahk_group cnen") && !toggle) {
setIME(1) ; 切换中文输入法中文状态
toggle := 1
}
Critical("Off")
}
; 设置输入法状态-获取状态-末位设置
setIME(s) {
; 获取当前活动窗口的默认输入法窗口句柄
imeWnd := DllCall("imm32\ImmGetDefaultIMEWnd", "UInt", WinExist("A"), "Ptr")
Sleep 300
; 发送消息,确保输入法处于中文状态
DllCall("SendMessage", "UInt", imeWnd, "UInt", 0x0283, "Int", 0x006, "Int", s)
Sleep 100
DllCall("SendMessage", "UInt", imeWnd, "UInt", 0x0283, "Int", 0x006, "Int", s)
}
最后重复一个DllCall,因为浏览器依然会切换错误,不知道为何
他的逻辑判断还是太复杂,而且偶尔会报错,浏览器输入经常会切换错误,原版KBLAutoSwitch已经停更
而且既然已经用上ahk,再开一个ahk编写的KBLAutoSwitch觉得怪怪的,于是自己精简一段出来:
我电脑上只安装一个中文输入法,逻辑比较简单:
Auto_Switch := 1
; 监听窗口切换输入法
if (Auto_Switch = 1) {
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "Str", "SHELLHOOK"), shellMessage)
}
; 接受系统窗口回调消息切换输入法
shellMessage(wParam, lParam,*) {
if (wParam = 1 || wParam = 32772 || wParam = 5 || wParam = 4) {
SetTimer IMESwitch, -200
}
}
; 根据激活窗口切换输入法
IMESwitch() {
static toggle := 1
Critical("On")
if(WinActive("ahk_group cnen") && toggle) {
setIME(0) ; 切换中文输入法英文状态
toggle := 0
} else
if(!WinActive("ahk_group cnen") && !toggle) {
setIME(1) ; 切换中文输入法中文状态
toggle := 1
}
Critical("Off")
}
; 设置输入法状态-获取状态-末位设置
setIME(s) {
; 获取当前活动窗口的默认输入法窗口句柄
imeWnd := DllCall("imm32\ImmGetDefaultIMEWnd", "UInt", WinExist("A"), "Ptr")
Sleep 300
; 发送消息,确保输入法处于中文状态
DllCall("SendMessage", "UInt", imeWnd, "UInt", 0x0283, "Int", 0x006, "Int", s)
Sleep 100
DllCall("SendMessage", "UInt", imeWnd, "UInt", 0x0283, "Int", 0x006, "Int", s)
}
最后重复一个DllCall,因为浏览器依然会切换错误,不知道为何
