yxp 发表于 2018-4-10 01:16:49

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.


56899 发表于 2018-4-13 15:09:37

669423907 发表于 2018-4-10 09:27
请教 yxp 大师,这是什么问题呢?

是的,我也出现这种情况了,把下载的dynwrapx.dll放在Windows\system32里面(一定是system32),再运行CMD就可以了,
另外发现个问题,如果我开了CAD和word,在CAD里面转换成了英文,当到word里面需要搜狗输入文字的时候,输入法还是英文,不能自动变回搜狗,如果在word里面调成搜狗,回到CAD,输入法还是搜狗,请问大神,这个可以调整吗?

FUShouyin 发表于 2018-5-6 17:05:56

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 发表于 2018-4-10 09:18:47

本帖最后由 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


bagu 发表于 2018-4-14 21:41:02

yxp 大师,对于CAD2017(14以下没问题)以上的版本,钢筋符号能显示,但预览及打印却没有,有解决的方法吗?望指点一二

asen 发表于 2018-4-13 23:33:14

dynwrapx 注册

H-浩浩-H 发表于 2018-4-10 05:16:21

谢谢分享,这样方便多了…

zixuan203344 发表于 2018-4-10 08:47:54

小蜜蜂666,紫薯布丁

lrd1861 发表于 2018-4-10 08:53:11

32位XP07用不起

pengfei2010 发表于 2018-4-10 09:26:02

厉害了 ,感谢楼主的分享

669423907 发表于 2018-4-10 09:27:34

请教 yxp 大师,这是什么问题呢?

669423907 发表于 2018-4-10 09:37:18

命令: (LOAD "C:/Users/Administrator/Desktop/ime-shift.lsp")
参数类型错误: VLA-OBJECT nil

dong20030432 发表于 2018-4-10 09:55:16

非常感谢您的分享!!!{:1_1:}

669423907 发表于 2018-4-10 10:05:31

csdn积分不够,下不了:'(,哪位方便传一份,谢谢了
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: CAD输入法自动切换程序(V1.02)