cad.net Win32API发送信息到cad

说明

代码来自于南胜

除了以下这个的方法还可以用端口通讯,不过端口通讯比这个还麻烦..
虽然例子是发送绘图信息,但是也可以发送加载信息.

如果本机打开了两个Acad08,com通讯只能处理第一个打开的,这份代码解决了这个问题.

只不过发送信息是用明码发送,也就是你会在命令栏看见:

端口通讯可以无码,两者在技术上面还有各自的优劣..

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using static Win32API.WinApi;

namespace JoinBoxTest
{
    public class PostCmdProcesses
    {
        static void Main(string[] args)
        {
            //获取所有acad的进程句柄
            var acadPros = Process.GetProcessesByName("acad");

            //通过进程句柄获取主窗口句柄
            foreach (var acadPro in acadPros)
            {
                var handle = acadPro.MainWindowHandle;
                if (handle == IntPtr.Zero)
                    continue;

                //发送报文到主窗口实现数据传入
                SendAcadProcesses(handle, "_circle 0,0,0 300 ");
            }
        }

        /// <summary>
        /// 发送信息到进程
        /// </summary>
        /// <param name="toSend">报文</param>
        /// <param name="hwnd">主窗口的句柄</param>
        public static void SendAcadProcesses(IntPtr hwnd, string toSend)
        {
            string data = toSend + "\0";
            var cds = new CopyDataStruct
            {
                dwData = new IntPtr(1),
                cbData = data.Length * Marshal.SystemDefaultCharSize,
                lpData = Marshal.StringToCoTaskMemAuto(data)
            };
            SendMessage(hwnd, (int)WM.WM_COPYDATA, IntPtr.Zero, ref cds);
            Marshal.FreeCoTaskMem(cds.lpData); //释放由非托管 COM 任务内存分配器分配的内存块。
        }
    }
}

namespace Win32API
{
    public partial class WinApi
    {
        /// <summary>
        /// 发送cad消息
        /// </summary>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, ref CopyDataStruct lParam);

        /// <summary>
        /// 发送信息的结构
        /// </summary>
        public struct CopyDataStruct
        {
            public IntPtr dwData;
            public int cbData;
            public IntPtr lpData;
        }
    }
}

相关阅读

Acad外部启动com通讯

Acad跨进程通讯

(完)

posted @ 2020-10-04 11:25  惊惊  阅读(608)  评论(0编辑  收藏  举报