明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 55966|回复: 266

[讨论] CAD输入法自动切换程序(V1.02)

    [复制链接]
发表于 2018-4-10 01:16 | 显示全部楼层 |阅读模式
本帖最后由 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 代码来查。
  1. (defun GetKey()
  2. (setq DWX (vlax-get-or-create-object "DynamicWrapperX"))
  3. (vlax-invoke DWX 'Register "user32" "GetKeyboardLayoutNameW" "i=p" "r=l")
  4. (setq ss (vlax-invoke DWX 'Space 9 " "))
  5. (setq pStr (vlax-invoke DWX 'StrPtr ss))
  6. (vlax-invoke DWX 'GetKeyboardLayoutNameW pStr)
  7. (vlax-invoke DWX 'strget pStr)
  8. )

说明:为何 ss 长度是9,因为标识符长度是 8 ,最后有个空字节来结束字符串,这是硬规定。
pStr 是字符串 ss 的指针,用来接收 API 函数 GetKeyboardLayoutNameW 传来的字符串。
在 CAD 里运行 (GetKey) 可以得到一个标识符,手动切换一次输入法,鼠标点或者按快捷键都可以,再运行 lisp 代码,可以得到另一标识符。


API 函数调用:

ActivateKeyboardLayout 和 LoadKeyboardLayout  函数都可以达到切换输入法的目的,ActivateKeyboardLayout 更合理些,只是激活已经加载到内存的输入法布局, LoadKeyboardLayout  则是加载一次输入法布局,可能会增加系统开支,但兼容性更好,因为前者需要的指针位置在不同的系统总是不一样的。


函数 ①  LoadKeyboardLayout :
  1. (vlax-invoke DWX 'Register "user32" "LoadKeyboardLayout" "i=sl" "r=q")
  2. (vlax-invoke DWX 'LoadKeyboardLayout "00000409" 1) ;;切换到英文
  3. (vlax-invoke DWX 'LoadKeyboardLayout "00000804" 1) ;;切换到中文

注意:上面代码的第二行和第三行分别将返回输入法布局标识的指针

函数 ②  
ActivateKeyboardLayout
  1. (vlax-invoke DWX 'Register "user32" "ActivateKeyboardLayout" "i=ql" "r=q")
  2. (vlax-invoke DWX 'ActivateKeyboardLayout 67699721 1)  ;;切换到英文
  3. (vlax-invoke DWX 'ActivateKeyboardLayout 134481924 1) ;;切换到中文

也可以直接用下面的 API 函数来测试键盘布局的指针
  1. (vlax-invoke DWX 'Register "user32" "GetKeyboardLayout" "i=q" "r=q")
  2. (vlax-invoke DWX 'GetKeyboardLayout 0) ;;手动切换一次输入法,再运行一次


不同的 Windows 系统指针位置将不同,以上的指针位置我只测试了Windows10 系统和搜狗输入法,请各位同学自行测试其他输入法的标识符和指针,欢迎留言。

修改系统输入法只是 LISP+DWX 调用 API 的一个小应用,理论上可以调用所有的标准 dll 函数库。



The End.


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

请教Y总,我Win10用的是QQ五笔输入法,您这自动切换输入法的功能可以用吗?谢谢您  发表于 2023-12-1 12:09
自动切换模式下 我忽然想用中文 可否按某个腱强行手动切换输入法!!求大大研究一下  发表于 2018-12-5 20:36
不好意思,知道了  发表于 2018-11-9 12:39
CH标识符00000804修改不了?能否改为E0200804?  发表于 2018-11-9 12:36

评分

参与人数 10明经币 +9 金钱 +60 收起 理由
tigcat + 10 很给力!
Nico + 1 很给力!
冰之绝恋 + 1 很给力!
ucuc2003 + 1
yanchao316 + 1
bagu + 1 + 50 支持原创
ㄘ丶转裑ㄧ灬 + 1 帮忙看下44楼的问题,谢谢
yxl88168 + 1
669423907 + 1 很给力!
自贡黄明儒 + 1

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-4-13 15:09 | 显示全部楼层
669423907 发表于 2018-4-10 09:27
请教 yxp 大师,这是什么问题呢?

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

使用道具 举报

发表于 2018-4-14 21:41 | 显示全部楼层
yxp 大师,对于CAD2017(14以下没问题)以上的版本,钢筋符号能显示,但预览及打印却没有,有解决的方法吗?望指点一二
回复 支持 1 反对 0

使用道具 举报

发表于 2018-4-13 23:33 | 显示全部楼层
dynwrapx 注册

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

不好意思,知道了  发表于 2018-11-9 12:39
回复 支持 1 反对 0

使用道具 举报

发表于 2018-4-10 05:16 来自手机 | 显示全部楼层
谢谢分享,这样方便多了…
发表于 2018-4-10 08:47 | 显示全部楼层
小蜜蜂666,紫薯布丁
发表于 2018-4-10 08:53 | 显示全部楼层
32位  XP  07用不起

点评

yxp
加载5楼32位的DynamicWrapperX  发表于 2018-4-10 09:43
发表于 2018-4-10 09:18 | 显示全部楼层
最新版本的 DynamicWrapperX 2.1.1.1:


网站:
http://dynwrapx.script-coding.com/dwx/pages/dynwrapx.php?lang=en


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2018-4-10 09:26 | 显示全部楼层
厉害了 ,感谢楼主的分享
发表于 2018-4-10 09:27 | 显示全部楼层
请教 yxp 大师,这是什么问题呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

也可以用cd 命令将目录切换到dynwrapx.dll目录下再执行regsvr32 dynwrapx.dll或者dynwrapx.dll直接带路径。  发表于 2018-4-11 09:11
yxp
注册时,dll 文件的路径如果不指定,需要放在Windows\system32里面吧  发表于 2018-4-10 10:06
发表于 2018-4-10 09:37 | 显示全部楼层
命令: (LOAD "C:/Users/Administrator/Desktop/ime-shift.lsp")
参数类型错误: VLA-OBJECT nil

点评

yxp
请先注册DynamicWrapperX  发表于 2018-4-10 09:59
发表于 2018-4-10 09:55 | 显示全部楼层
非常感谢您的分享!!!
发表于 2018-4-10 10:05 | 显示全部楼层
csdn积分不够,下不了,哪位方便传一份,谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 04:17 , Processed in 0.261131 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表