print1985 发表于 2021-1-30 19:38:56

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

本帖最后由 print1985 于 2021-4-4 12:17 编辑


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

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

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

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

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using System;
using System.Runtime.InteropServices;

namespace inputting
{
    public class inputting
    {
      
      public static extern IntPtr FindWindow(string ClassName, string WindowName);//窗口句柄
      
      public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);//线程
      
      public static extern int GetKeyboardLayout(int threadid);//键盘布局(输入法)

      //
      //public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);//模拟按键用

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

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

                  /* 也可用模拟按键切换 ctrl+空格
                  //模拟按下ctrl键
                  keybd_event(0x11, 0, 0, 0);
                  //模拟按下空格键
                  keybd_event(0x20, 0, 0, 0);
                  //模拟松开ctrl键
                  keybd_event(0x11, 0, 2, 0);
                  //模拟松开空格键
                  keybd_event(0x20, 0, 2, 0);
                  ed.WriteMessage("已切换");
                  */
                }
            }
            else
            {
                ed.WriteMessage("未找到CAD窗口,输入法自动切换失败");
            }
            return null;
      }
    }
}自动切换输入法有很多种,我也凑热闹弄了个超简单的输入法切换给大家玩,源码源码
功能:在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



xj6019 发表于 2021-1-30 22:03:33

非常棒,谢谢分享,问两个反应器可以赐教吗,有没有ESC的反应器和CTRL+Z的反应器呀

print1985 发表于 2021-1-30 22:36:28

xj6019 发表于 2021-1-30 22:03
非常棒,谢谢分享,问两个反应器可以赐教吗,有没有ESC的反应器和CTRL+Z的反应器呀

这2个按键好像是没有,关于反应器论坛有很多源码,感兴趣的话你可以研究一下,我也不太熟悉:lol
如果你会C#,倒是可以用一个键盘钩子来解决

brainstorm 发表于 2021-6-27 22:22:19

你这个是否区分是命令行输入 还是在opm 等其他面板输入

slmmwan2008 发表于 2023-4-14 18:46:48

非常棒,谢谢分享
页: [1]
查看完整版本: lisp+c#混合编程之--超简单的输入法切换(源码)