代码来自于南胜
除了以下这个的方法还可以用端口通讯,不过端口通讯比这个还麻烦...
虽然例子是发送绘图信息,但是也可以发送加载信息....
重要的是这份代码解决了com通讯只能处理相同的两个cad,例如你打开了两个cad08,导致了只能处理第一个打开的....
只不过发送信息是用明码发送,也就是你会在命令栏看见:
端口通讯可以无码,两者在技术上面还有各自的优劣....

using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace ConsoleApp1 { public class exe发送到cad { static void Main(string[] args) { //获取所有acad的进程句柄 var pros = Process.GetProcessesByName("acad"); //通过进程句柄获取主窗口句柄 foreach (var item in pros) { //发送报文到主窗口实现数据传入 SendCad.SendAcadProcesses("_circle 0,0,0 300 ", item.MainWindowHandle); } } } public class SendCad { [DllImport("user32.dll", EntryPoint = "SendMessage")] static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref COPYDATASTRUCT lParam); /// <summary> /// 发送信息到进程 /// </summary> /// <param name="toSend">报文</param> /// <param name="hwnd">主窗口的句柄</param> public static void SendAcadProcesses(string toSend, IntPtr hwnd) { string data = toSend + ""; const int WM_COPYDATA = 0x4A; var cds = new COPYDATASTRUCT { dwData = new IntPtr(1), cbData = data.Length * Marshal.SystemDefaultCharSize, lpData = Marshal.StringToCoTaskMemAuto(data) }; SendMessage(hwnd, WM_COPYDATA, IntPtr.Zero, ref cds); Marshal.FreeCoTaskMem(cds.lpData); } /// <summary> /// 发送信息的结构 /// </summary> private struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; public IntPtr lpData; } } }