本帖最后由 baitang36 于 2024-5-30 16:11 编辑

Windows是支持多国语言的,每种语言对应一种键盘布局(KeyboardLayout),在英文键盘布局下只能输入英文,在中文键盘布局下可以切换输入法,可以输入中文,也可以输入英文。

经过试验,我用保留函数实现了切换键盘布局的操作函数。用途吗,就是让lsp爱好者能够方便的打造自己的自动切换输入法。
在syz-kb_pro.fas中定义了三个函数:syz-currentKeyboardLayout  syz-setKeyboardLayout-chn  syz-setKeyboardLayout-eng
(syz-currentKeyboardLayout)是获取系统当前使用的键盘布局,英文返回字符串"ENG",中文返回"CHN"
(syz-setKeyboardLayout-chn)是设置键盘布局为中文
(syz-setKeyboardLayout-eng)是设置键盘布局为英文
因为是用的纯lisp,因此不挑版本,支持所有AutoCAD版本,32位和64位同样支持,包括最新的acad2025,也支持lispsys=1的情况。

请参考yxp大侠的这个帖子CAD输入法自动切换程序(V1.02) - AutoLISP/Visual LISP 编程技术 - AutoCAD论坛 - 明经CAD社区 - Powered by Discuz! (mjtd.com)

帖子发表后,有的朋友说不会用。我写了个使用它的例子,是参考上述yxp大侠的代码修改的,请下载试用。
例子中(setq *COM_DEF# '("MTEDIT" "MTEXT" "DDEDIT" "TEXT" "TEXTEDIT"))是自动切换到中文的命令,可以按自己需要增减。

autoim.lsp源码如下:
  1. (vl-load-com)
  2. (load "c:/00/syz-kb_pro.fas")
  3. (setq *COM_DEF# '("MTEDIT" "MTEXT" "DDEDIT" "TEXT" "TEXTEDIT"))
  4. (defun ime-shift()
  5. (defun *fun_str#(x y)(if (member(car y) *com_def#)(syz-setKeyboardLayout-chn)))
  6. (defun *fun_end#(x y)(syz-setKeyboardLayout-eng))
  7. (vlr-command-reactor nil '((:vlr-commandWillStart . *fun_str#)))
  8. (foreach x '(:vlr-commandEnded :vlr-commandCancelled)(vlr-command-reactor nil (list(cons x (quote *fun_end#)))))
  9. (syz-setKeyboardLayout-eng)(princ))
  10. (ime-shift)
  11. (princ)






网友答: 本帖最后由 baitang36 于 2024-5-26 16:18 编辑

按惯例,没币的在这里下载

网友答: 本帖最后由 baitang36 于 2024-5-28 05:45 编辑
e2002 发表于 2024-5-27 17:25
有没有办法,使切换到中文键盘布局时,使用的中文输入法,就是设置为中文输入状态?

Windows中的中文输 ...

试验过,win10会记忆你的输入法状态,你设置成中文,切换到英文布局后再切换成中文布局,输入法状态会恢复你原来的中文状态的。
WINDOWS在键盘输入这块搞得非常复杂,语言区域下有键盘布局,键盘布局下有输入法,输入法下有英文和中文,中文输入法又有好多种,常用的有搜狗、微软、百度、讯飞、微信。还有人喜欢五笔。
要精准控制输入法状态,就要去研究各种输入法,针对各种输入法去写程序。对于个人来说,这几乎是不可能完成的任务。
目前的输入法自动切换,都存在这样那样的问题,根本原因就是对现有的众多输入法没有研究透彻。没有从深层次去研究,只是根据使用习惯去编程,用户的使用习惯五花八门,就会出各种状况。
我用的方法是避开具体的输入法,不会受用户习惯影响。思路清晰且固定,状态就两种,我不管用户怎么用,让用户去适应我。

网友答: 本帖最后由 qazxswk 于 2024-5-27 12:13 编辑
moranyuyan 发表于 2024-5-27 08:05
我是在(setq *COM_DEF# '("MTEDIT" "MTEXT" "DDEDIT" "TEXT" "TEXTEDIT"  "ERN" "ZML"))这一句添加新的指 ...

不是这样的,是在你的插件中,写入切换输入法的代码
比如:


(defun c:11(/ )
(syz-setKeyboardLayout-chn)
(你的插件内容)
(if(= (syz-currentKeyboardLayout) "CHN") (syz-setKeyboardLayout-eng))
(princ)
)



网友答: 2个币,不舍得

网友答:
潘成祥2015 发表于 2024-5-25 09:48
下载了,
不会用

你得把楼主的“syz-kb_pro”文件位置放置在"c:/00"目录下面,没有“00”文件夹就要新建,不然程序加载提示是错误滴






    我使用傲游云浏览器


    网友答:

    1. 用老师的这个模拟按键

    2. http://bbs.mjtd.com/thread-187076-1-1.html
    3. 可以把用shift切换,比如搜狗。这样win7系统可以的
    4. (defun Press-Shift( / VK_SHIFT)
    5. (setq VK_SHIFT 16 );Shift键
    6. (if (null syz_press)
    7. (alert "需加载按键插件")
    8. (syz_press VK_SHIFT);需加载按键插件
    9. )
    10. )


    网友答: 哈哈,谢谢楼主分享,沙发

    网友答: 大神又出精品了!

    网友答: 配合命令反应器就可以实现切换了

    网友答: 下载了,
    不会用

    网友答: 没有币下载不了

    网友答:
    下载了,
    不会用

    网友答: 我试了一下,确实爽

    网友答: 试了下 Win11下有用 这下不用每次开cad都去切换输入法了。

    网友答: 重启CAD还是恢复中文布局?如何记忆?
  • 上一篇:【原创】修复被破坏的vlax-get函数
  • 下一篇:没有了