具体的代码可以到我的代码仓库找 https://github.com/mudssky/myAHKScripts
自动切换输入法,个人的需求主要是,在不需要或者很少需要中文输入的环境,比如说vscode,windows,terminal。这样工作体验就会更加顺滑。(我之前使用rime输入法就支持配置这个操作)
实现自动切换输入法,需要以下几点的前置储备
个人对windows api不是很熟悉,因此查了各种文档,最后还是从别人现成的实现里试着来修改。
因为以前的人用的都是老版本v1的语法,加上他们也没有什么函数命名的概念,给我的感觉就是很难读懂。
下面我的版本使用了v2的语法,并且把那些api都封装好了,相当于开箱即用了。
dllcall就可以用来调用windows api
window group适合用于批量监视窗口。
另外如果你想编写ahk的脚本的话,官方提供的windows spy脚本还是挺好用的。可以看到窗体的各种信息,方便你针对窗口编写程序。
但是因为我用的是v2版本,每次要用只能切到对应目录,拖到v1的执行程序上执行。
注意win10自带了给不同应用窗口使用不同输入法的功能。我的这个脚本最好配合开启win10自带的功能一起使用
win10自带的功能不足以满足需求的原因是,它貌似只会记录活动窗体的输入法状态,但是你把窗体关闭再重启后,就又是默认输入法了。
也许你把默认输入法设置为英文,再加上windows自带的功能就能满足一部分需求了。
方法二 识别微软拼音的中英文模式
评论区有人提供了查询输入法中英文状态的api,那么只要检测状态,然后用Shift进行切换就可以了。比我之前切换输入法要方便一些。
; 设置脚本是否可以 "看见" 隐藏的窗口
DetectHiddenWindows True
; 可以用于判断微软拼音是否是英文模式
isEnglishMode(){
hWnd := winGetID("A")
result := SendMessage(
0x283, ; Message : WM_IME_CONTROL
0x001, ; wParam : IMC_GETCONVERSIONMODE
0, ; lParam : (NoArgs)
, ; Control : (Window)
; 获取当前输入法的模式
; Retrieves the default window handle to the IME class.
"ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
; DetectHiddenWindows Fasle
; 返回值是0表示是英文模式,其他值表明是中文模式
return result == 0