Page 1 of 1

Ahk之自动切换中英文输入法思路与运用说明

Posted: 05 Jan 2024, 22:09
by td3zzz
Ahk之自动切换中英文输入法思路与运用说明

本文为《自用ahk热键脚本及相关回顾》中2.3自动切换中英文输入法相关部分说明。讲解下学习经历、思路和一些疑难问题,帮助新入门同学减少弯路,高手们请忽略。

作为非英语原生语言的中文用户,在不同窗口、界面切换中英文输入法可以说是非常频繁的操作,在操作系统和输入法厂商不怎么作为的情况下,用ahk来自动切换就是一种不错的选择(当前现在某些智能输入法自己也有类似功能了)。除了可以在某些界面默认自动设置为想要的中英文状态外,我更可以便捷地使用单键热键,避免输入法的干扰(具体也可参考《Ahk之单键热键思路与运用详解》)。那么,具体怎么办呢?
1.自动切换中英文输入法思路
根据一般逻辑思考,想要实现自动切换中英文,主要需要以下步骤:
1.1明确英文状态界面或者中文状态界面分别有哪些
这个需要根据不同人自身的需求,例如任务栏、图片浏览、视频浏览、阅读器等界面为英文界面A,记事本、word、excel等文字输入界面为中文界面B。资源管理器、浏览器等复杂界面看个人习惯。当然,也可以只设置其中一组即可,如果不是这组中的界面,那么就全部默认为相反的状态。例如,我就是设置电脑默认输入法为搜狗中文,因此只设置了英文界面A,只在碰到这些界面时自动切换输入法为英文状态。
1.2持续以一定频率(例如0.5秒)监测当前窗口名称
目的就是及时发现窗口发生变化情况,如果发现窗口名称为界面A,就发送命令切换为英文输入法,或者如果发现窗口名称为界面B,就发送命令切换为中文输入法。而且,重要的是,完成这一个动作之后,要让程序继续开始监测,形成循环,否则下一次变化窗口界面就无法自动切换了。
很多新手同学容易犯的一个错误就是没有持续进行监测动作,想当然以为软件会自动监测,或者会自动循环,但实际上这些都是需要自己写代码语句的。当然ahk中使用WinWaitActive命令可以有效简化这个过程。
1.3发送切换中英文输入法的命令
这个就有很多前人的轮子了,可以在网上找找别人写好的代码语句。例如一位日本友人的IME_GET输入法相关函数,或者直接用一句命令语句等等。我因为默认输入法为搜狗中文,这里使用的就是一句切换搜狗成英文半角状态的语句:DllCall("SendMessage" , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,WinExist("A")), UInt, 0x0283 , Int, 0x002 , Int, 0x00) ;切换搜狗拼音成英文半角状态
其他输入法,或者其他切换输入法状态的命令(包括中英文、半角全角等),大家可以自行在网络查找总结归纳,具体原理就不是我这个三脚猫外行能够讲解的了。
2.具体实现代码
根据上述思路,具体写代码就比较容易了。
2.1定义窗口组

Code: Select all

;启动时需默认英文输入状态的窗口
GroupAdd,English, ahk_class ShImgVw:CPreviewWnd  ;图片浏览器
GroupAdd,English, ahk_class IrfanView ;……………IrfanView图片查看器
GroupAdd,English, Total Commander ahk_class TOverWriteForm ;……………………tc覆盖粘贴时弹出的窗口
GroupAdd,English, ahk_class TdxW_MainFrame_Class ;……………………通达信
;GroupAdd,English, ahk_class Shell_TrayWnd ;……………………任务栏
GroupAdd,English, QQ影音 ahk_class QQPlayer Window ;……………………QQ影音
GroupAdd,English, 同花顺 ahk_exe hexin.exe
GroupAdd,English, ahk_class uie_eslyric_desktop_wnd_class ;……………………foobar2000桌面歌词界面
GroupAdd,English, ahk_class SUMATRA_PDF_FRAME ;……………………SumatraPDF阅读器
;广告窗口,暂与English并列
GroupAdd,English, TeamViewer ahk_class HTML Application Host Window Class  ;………………TeamViewer广告
GroupAdd,English, 搜狐影音 ahk_class SohuWin  ;………………搜狐影音广告
2.2设置监测、循环及切换中英文语句

Code: Select all

toEnglish:    ;{英文输入法界面
	WinWaitActive ahk_group English
	WinGetClass, nowclass
	Sleep,100
	DllCall("SendMessage" , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,WinExist("A")), UInt, 0x0283   ,  Int, 0x002  ,  Int, 0x00)   ;切换搜狗拼音成英文半角状态
	Sleep,500
	WinWaitNotActive,ahk_class %nowclass%
	goto,toEnglish
	Return
这段代码中使用了goto语句,正常规范是不推荐使用的,可以更改为标准循环语句,不过我作为外行,而且只是这种简短代码小功能,就无所谓了。
3.其他需要注意及想说的一些内容
3.1代码需放置于自动执行段

由于自动切换输入法状态需要持续监测当前窗口界面情况,所以必须保证代码在脚本启动时立即运行,并持续运行。因此,这段代码需要放置于ahk脚本的自动执行段(或者叫脚本顶部,详见ahk帮助文档),也就是要在所有 热键、热字串、标签、 Return、Exit等前面。这也是新手非常容易犯的一个错误。
3.2自动关闭广告窗口
从自动切换中英文输入法的思路可以看出,自动关闭广告窗口的思路也是大体一致的,也就是持续监测当前窗口名称,如果发现当前窗口是广告窗口,就发送关闭的命令。所以,在上述定义窗口组的代码中,还有几句其实是广告窗口,可以在循环代码中增加判断、关闭广告窗口的语句。例如:

Code: Select all

	if nowclass in HTML Application Host Window Class,SohuWin
	{
		Sleep, 1000
		WinClose,ahk_class %nowclass%
		goto,toEnglish
	}
3.3窗口界面分类可以更加细化
例如同在资源管理器窗口,当鼠标光标在中间空白区域时,希望是英文状态(便于首字母搜索),但当鼠标光标在搜索框区域时,希望是中文状态,等等,大家可以尝试根据控件名称来做更细化的判断。具体也可以参考《Ahk之单键热键思路与运用详解》。不过我自身需求不大,就没有去做了。

最后,还是要特别感谢下网络上很多热心分享代码的前辈,这个小功能中最难的还是切换输入法状态本身的语句,都是借鉴IME_GET输入法相关函数等获取的,我们这些业外人员想要自己研究实现恐怕没什么希望了。特此致谢!

作者:阿让(arang)
2024年1月6日