CAD输入法自动切换程序(V1.02)
本帖最后由 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/05V1.00集成了 dwx 注册功能,命令编辑功能,自动添加启动组功能等,加载后运行命令 imaut,设置完毕 imaut.vlx 程序可删除(不需要手动添加启动组)。
2018/05/10V1.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.
669423907 发表于 2018-4-10 09:27
请教 yxp 大师,这是什么问题呢?
是的,我也出现这种情况了,把下载的dynwrapx.dll放在Windows\system32里面(一定是system32),再运行CMD就可以了,
另外发现个问题,如果我开了CAD和word,在CAD里面转换成了英文,当到word里面需要搜狗输入文字的时候,输入法还是英文,不能自动变回搜狗,如果在word里面调成搜狗,回到CAD,输入法还是搜狗,请问大神,这个可以调整吗? Aries 发表于 2018-5-5 20:39
我又来了,又来提问题了,w7的64位2018CAD搜狗输入法不能切换。微软输入法和qq输入是可以切换的但是属性块 ...
把C:\Windows\System32\ime-shift.lsp里面的
(defun *fun_str#(x y)(if (member(car y) *com_def#)(vlax-invoke *DWX# 'LoadKeyboardLayout "00000804" 1)))中00000804换成搜狗输入法对应的主键值
本帖最后由 e2002 于 2024-5-27 20:59 编辑
Update:最新版本的 DynamicWrapperX 2.2.0.0
感谢几位大佬在本站提供了中文页面,可以直接下载了。
static/image/hrline/1.gif
最新版本的 DynamicWrapperX 2.1.1.1:
网站:
http://dynwrapx.script-coding.com/dwx/pages/dynwrapx.php?lang=en
yxp 大师,对于CAD2017(14以下没问题)以上的版本,钢筋符号能显示,但预览及打印却没有,有解决的方法吗?望指点一二 dynwrapx 注册
谢谢分享,这样方便多了… 小蜜蜂666,紫薯布丁 32位XP07用不起 厉害了 ,感谢楼主的分享 请教 yxp 大师,这是什么问题呢?
命令: (LOAD "C:/Users/Administrator/Desktop/ime-shift.lsp")
参数类型错误: VLA-OBJECT nil 非常感谢您的分享!!!{:1_1:} csdn积分不够,下不了:'(,哪位方便传一份,谢谢了