本帖最后由 yxp 于 2021-4-16 12:40 编辑
应用背景:
1. CAD 启动后,进入界面经常是中文输入法(默认需要英文);
2. 在 CAD 快速制图时,需要修改中文,却经常需要切换输入法;
3. 用中文编辑完文字,经常忘了把中文输入法切换回英文;
4. Win10 输入法的快键切换总是不太灵光(可能和其他软件快键发生冲突)。
受到 fyw12345 兄的启发,本人用 lisp+dwx 调用 Windows api 改写了输入法自动切换程序,全部解决了这些问题,双击文字也可以自动切换输入法,这下 CAD 用起来爽快多了,以下贴出源码,欢迎大家测试。
原版参见:http://bbs.mjtd.com/thread-176934-1-1.html
和原版相比,本程序不需要在 Windows 里添加设置 ctrl+shift+1,ctrl+shift+0 的输入法切换方式(容易快键冲突)。
程序下载:
以下程序在 64 位 Windows 10 系统中 AutoCAD 2012-2019 (64位)里调试通过,请从附件下载最新版。
程序已将 dll 文件编译打包进 vlx/fas 里,单独的 lisp 文件反而不能正常运行。
2018/05/05 V1.00 集成了 dwx 注册功能,命令编辑功能,自动添加启动组功能等,加载后运行命令 imaut,设置完毕 imaut.vlx 程序可删除(不需要手动添加启动组)。
2018/05/10 V1.02 修正一些小bug,增加输入法标识符输入接口,针对 win7 系统时可以手工切换输入法,双击标识符列表可查看。WIN7 的中文标识符:E0200804; 英文标识符: 00000409
CAD启动运行 imaut 界面如下:
以下两个文件任选其一:
FAS 文件下载:
VLX 文件下载:
(图1,暂不支持32位CAD和Windows系统)
不能正常使用的同学,请按以下步骤检查(Windows 10):
1. 左键点击任务栏里的 CH,会有CH 和 EN 两种语言,一般如下图,
(图2)
2. 右键点击任务栏里的 CH,然后点设置,如下图:
(图3)
3. 点击2图选项,弹出下图,在输入法栏里最好只保留一个中文输入法。
另外,WIN10 系统手动切换 CH 和 EN 的快捷键是 Win + 空格键。
好了,基本上满足程序所需的全部条件了。
(图4)
实现原理:
WIN10 默认有多个键盘布局,而且中文布局里也可以添加英文布局,这就是大家自动切换失败的原因。中文布局里可以有多个输入法,但是最好都是中文输入法,比如五笔输入法和搜狗输入法等等,“最好只保留一个”是因为我就用一个中文输入法测试的,哈哈。这样,用 API 在 CH 和 EN 布局之间切换时,就相当于中英文间切换。
API 函数说明:
一般调用 Windows API 设置输入法切换有两个函数:
LoadKeyboardLayout 加载一个指定的键盘布局,参数为语言和设备标识符组成的16进制字符,例如英文键盘为 "00000409"
ActivateKeyboardLayout 激活一个指定的键盘布局的,参数为指定键盘布局的 HKL (标识符存放的指针)
上面两个 API 函数可以任选一个,用来切换输入法。
标识符可以在 Windows 注册表里查到,或者用下面 LISP 代码来查。
- (defun GetKey()
- (setq DWX (vlax-get-or-create-object "DynamicWrapperX"))
- (vlax-invoke DWX 'Register "user32" "GetKeyboardLayoutNameW" "i=p" "r=l")
- (setq ss (vlax-invoke DWX 'Space 9 " "))
- (setq pStr (vlax-invoke DWX 'StrPtr ss))
- (vlax-invoke DWX 'GetKeyboardLayoutNameW pStr)
- (vlax-invoke DWX 'strget pStr)
- )
说明:为何 ss 长度是9,因为标识符长度是 8 ,最后有个空字节来结束字符串,这是硬规定。
pStr 是字符串 ss 的指针,用来接收 API 函数 GetKeyboardLayoutNameW 传来的字符串。
在 CAD 里运行 (GetKey) 可以得到一个标识符,手动切换一次输入法,鼠标点或者按快捷键都可以,再运行 lisp 代码,可以得到另一标识符。
API 函数调用:
ActivateKeyboardLayout 和 LoadKeyboardLayout 函数都可以达到切换输入法的目的,ActivateKeyboardLayout 更合理些,只是激活已经加载到内存的输入法布局, LoadKeyboardLayout 则是加载一次输入法布局,可能会增加系统开支,但兼容性更好,因为前者需要的指针位置在不同的系统总是不一样的。
函数 ① LoadKeyboardLayout :
- (vlax-invoke DWX 'Register "user32" "LoadKeyboardLayout" "i=sl" "r=q")
- (vlax-invoke DWX 'LoadKeyboardLayout "00000409" 1) ;;切换到英文
- (vlax-invoke DWX 'LoadKeyboardLayout "00000804" 1) ;;切换到中文
注意:上面代码的第二行和第三行分别将返回输入法布局标识的指针
函数 ② ActivateKeyboardLayout :
- (vlax-invoke DWX 'Register "user32" "ActivateKeyboardLayout" "i=ql" "r=q")
- (vlax-invoke DWX 'ActivateKeyboardLayout 67699721 1) ;;切换到英文
- (vlax-invoke DWX 'ActivateKeyboardLayout 134481924 1) ;;切换到中文
也可以直接用下面的 API 函数来测试键盘布局的指针- (vlax-invoke DWX 'Register "user32" "GetKeyboardLayout" "i=q" "r=q")
- (vlax-invoke DWX 'GetKeyboardLayout 0) ;;手动切换一次输入法,再运行一次
不同的 Windows 系统指针位置将不同,以上的指针位置我只测试了Windows10 系统和搜狗输入法,请各位同学自行测试其他输入法的标识符和指针,欢迎留言。
修改系统输入法只是 LISP+DWX 调用 API 的一个小应用,理论上可以调用所有的标准 dll 函数库。
The End.
|