明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2380|回复: 4

[源码] lisp+c#混合编程之--超简单的输入法切换(源码)

[复制链接]
发表于 2021-1-30 19:38 | 显示全部楼层 |阅读模式
本帖最后由 print1985 于 2021-4-4 12:17 编辑

  1. (vl-load-com);加载VL函数

  2. ;以下为自动加载dll代码,修改为你的AganInp.dll路径(注意路径为双斜杠)
  3. (vl-cmdf "netload" "D:\\Program Files\\Autodesk\\AutoCAD 2014\\Support\\AganInp.dll")

  4. ;反应器,加载lisp后即运行
  5. (vlr-command-reactor nil '((:vlr-commandEnded . GL:changeen)     ;command命令完成后切换为英文
  6.                            (:vlr-commandCancelled . GL:changeen)  ;command命令取消后切换为英文
  7.                            (:vlr-unknownCommand . GL:changeen)    ;command输入未知命令后切换为英文
  8. ))

  9. (defun GL:changeen(a b)
  10. (GC:changeen T) ;C#切换输入法为英文
  11. (princ)
  12. )


  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.EditorInput;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using System;
  6. using System.Runtime.InteropServices;

  7. namespace inputting
  8. {
  9.     public class inputting
  10.     {
  11.         [DllImport("user32.dll")]
  12.         public static extern IntPtr FindWindow(string ClassName, string WindowName);//窗口句柄
  13.         [DllImport("user32.dll")]
  14.         public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);//线程
  15.         [DllImport("user32.dll")]
  16.         public static extern int GetKeyboardLayout(int threadid);//键盘布局(输入法)

  17.         //[DllImport("user32.dll")]
  18.         //public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);//模拟按键用

  19.         [LispFunction("GC:changeen")] //lisp调用函数名字
  20.         public static ResultBuffer qhenus(ResultBuffer rb)
  21.         {
  22.             if (rb == null) return null;
  23.             TypedValue[] values = rb.AsArray();//返回值为数组,相当于lisp里面的表list

  24.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  25.             IntPtr cadhwnd = FindWindow(null, null);//窗口句柄
  26.             int cadID = 0;
  27.             int threadid = 0;
  28.             threadid = GetWindowThreadProcessId(cadhwnd, out cadID);
  29.             int num = GetKeyboardLayout(threadid);//取得一个句柄,描述指定应用程序的键盘布局,经比较中文输入法都小于0
  30.             if (cadhwnd != IntPtr.Zero)
  31.             {
  32.                 if (num < 0)
  33.                 {
  34.                     //API切换输入法为英文
  35.                     System.Windows.Forms.InputLanguage.CurrentInputLanguage =
  36.                     System.Windows.Forms.InputLanguage.FromCulture(System.Globalization.CultureInfo.GetCultureInfo("en-US"));

  37.                     /* 也可用模拟按键切换 ctrl+空格
  38.                     //模拟按下ctrl键
  39.                     keybd_event(0x11, 0, 0, 0);
  40.                     //模拟按下空格键
  41.                     keybd_event(0x20, 0, 0, 0);
  42.                     //模拟松开ctrl键
  43.                     keybd_event(0x11, 0, 2, 0);
  44.                     //模拟松开空格键
  45.                     keybd_event(0x20, 0, 2, 0);
  46.                     ed.WriteMessage("已切换");
  47.                     */
  48.                 }
  49.             }
  50.             else
  51.             {
  52.                 ed.WriteMessage("未找到CAD窗口,输入法自动切换失败");
  53.             }
  54.             return null;
  55.         }
  56.     }
  57. }
自动切换输入法有很多种,我也凑热闹弄了个超简单的输入法切换给大家玩,源码源码
功能:在CAD命令结束时自动切换为英文输入法,妈妈再也不用担心忘记切换输入法了,soeasy!
我的测试环境:win7 64位 CAD2020、CAD2014
个人能力有限,更多功能大家共同开发,谢谢大家!
C#代码只做了个框架,可以增加内容,当然也可以精简优化,即使不做任何修改也是完全能用的。
lisp+c#混合编程只是为大家提供一个编程的思路,有lisp基础的童鞋简单学习一下C#,混合编程能做出 一些纯lisp很难实现的功能


现在明经上传不了附件,编译好的DLL文件可以到晓东下载http://bbs.xdcad.net/thread-727562-1-1.html
新版本:http://bbs.mjtd.com/thread-183157-1-1.html



评分

参与人数 2明经币 +2 收起 理由
lxw320 + 1 很给力!
jun353835273 + 1 很给力!分享c#代码的太少了,你这样干真好.

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-1-30 22:03 | 显示全部楼层
非常棒,谢谢分享,问两个反应器可以赐教吗,有没有ESC的反应器和CTRL+Z的反应器呀
 楼主| 发表于 2021-1-30 22:36 | 显示全部楼层
xj6019 发表于 2021-1-30 22:03
非常棒,谢谢分享,问两个反应器可以赐教吗,有没有ESC的反应器和CTRL+Z的反应器呀

这2个按键好像是没有,关于反应器论坛有很多源码,感兴趣的话你可以研究一下,我也不太熟悉
如果你会C#,倒是可以用一个键盘钩子来解决
发表于 2021-6-27 22:22 来自手机 | 显示全部楼层
你这个是否区分是命令行输入 还是在opm 等其他面板输入
发表于 2023-4-14 18:46 | 显示全部楼层
非常棒,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 12:28 , Processed in 0.265195 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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