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
非常棒,谢谢分享,问两个反应器可以赐教吗,有没有ESC的反应器和CTRL+Z的反应器呀 xj6019 发表于 2021-1-30 22:03
非常棒,谢谢分享,问两个反应器可以赐教吗,有没有ESC的反应器和CTRL+Z的反应器呀
这2个按键好像是没有,关于反应器论坛有很多源码,感兴趣的话你可以研究一下,我也不太熟悉:lol
如果你会C#,倒是可以用一个键盘钩子来解决 你这个是否区分是命令行输入 还是在opm 等其他面板输入 非常棒,谢谢分享
页:
[1]