实例是用winform做的...主要是消息机制部分...
实例代码:
var cadProcess = new CadProcess(); if (cadProcess.Record.Length == 0) { cadProcess.Run(CadProcess.RunCadVer.All); } if (cadProcess.Record.Length == 0) { MessageBox.Show("你没有安装cad吗?"); return; }
//启动cad
using System; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; namespace JoinBoxCurrency { public class CadProcess { public enum RunCadVer { Minimum, Maximum, All, } public Process[] Record { get; private set; } const string _acad = "acad"; const string _acadexe = "\\acad.exe"; string _workingDirectory; /// <summary> /// 获取已经打开的cad程序 /// </summary> public void GetExisting() { Process[] pros = Process.GetProcessesByName(_acad); if (pros.Length > 0) { Record = pros; } } /// <summary> /// 构造函数,初始化 /// </summary> public CadProcess() { Record = new Process[0]; _workingDirectory = Environment.GetEnvironmentVariable("TEMP"); } /// <summary> /// 启动cad程序 /// </summary> /// <param name="runCadVer">启动什么版本</param> public void Run(RunCadVer runCadVer = RunCadVer.Minimum) { string progID = "AutoCAD.Application."; string exePath = null; //获取本机cad路径 var regedit = new AcadDirs(); if (regedit.Dirs.Count == 0) { return; } //按照版本排序 var ob = regedit.Dirs.OrderBy(cad => cad.Version).ToList(); switch (runCadVer) { case RunCadVer.Minimum: { progID += ob[0].Version; exePath = ob[0].Location + _acadexe; Run(progID, exePath); } break; case RunCadVer.Maximum: { progID += ob[ob.Count].Version; exePath = ob[ob.Count].Location + _acadexe; Run(progID, exePath); } break; case RunCadVer.All: { foreach (var reg in regedit.Dirs) { Run(progID + reg.Version, reg.Location + _acadexe); } } break; } } private void Run(string progID, string exePath) { //处理GetActiveObject在电脑睡眠之后获取就会失败.所以要ProcessStartInfo //https://blog.csdn.net/yuandingmao/article/details/5558763?_t_t_t=0.8027849649079144 //string progID = "AutoCAD.Application.17.1"; //string exePath = @"C:\Program Files (x86)\AutoCAD 2008\acad.exe"; object acApp = null; try { acApp = Marshal.GetActiveObject(progID); } catch { } if (acApp == null) { try { // var psi = new ProcessStartInfo(exePath, "/p myprofile");//使用cad配置,myprofile是配置名称,默认就不写 var psi = new ProcessStartInfo(exePath, "/nologo") { WorkingDirectory = _workingDirectory//这里什么路径都可以的 }; Process pr = Process.Start(psi); pr.WaitForInputIdle(); while (acApp == null) { try { acApp = Marshal.GetActiveObject(progID); } catch { Application.DoEvents(); } Thread.Sleep(500); } } catch (Exception ex) { throw new Exception("无法创建或附加到AutoCAD对象: " + ex.Message); } } if (acApp != null) { GetExisting(); } } } }
//通过注册表获取cad安装路径
using System.Collections.Generic; using System.IO; using Microsoft.Win32; namespace JoinBoxCurrency { public class AcadDirs { public List<AcadProductKey> Dirs { get;} /// <summary> /// 通过注册表获取本机所有cad的安装路径 /// </summary> public AcadDirs() { Dirs = new List<AcadProductKey>(); RegistryKey Adsk = Registry.CurrentUser.OpenSubKey(@"Software\Autodesk\AutoCAD"); if (Adsk == null) { return; } foreach (string ver in Adsk.GetSubKeyNames()) { try { RegistryKey emnuAcad = Adsk.OpenSubKey(ver); var curver = emnuAcad.GetValue("CurVer"); if (curver == null) { return; } string app = curver.ToString(); string fmt = @"Software\Autodesk\AutoCAD\{0}\{1}"; emnuAcad = Registry.LocalMachine.OpenSubKey(string.Format(fmt, ver, app)); if (emnuAcad == null) { fmt = @"Software\Wow6432Node\Autodesk\AutoCAD\{0}\{1}"; emnuAcad = Registry.LocalMachine.OpenSubKey(string.Format(fmt, ver, app)); } var acadLocation = emnuAcad.GetValue("AcadLocation"); if (acadLocation == null) { return; } string location = acadLocation.ToString(); if (File.Exists(location + "\\acad.exe")) { var produ = emnuAcad.GetValue("ProductName"); if (produ == null) { return; } string productname = produ.ToString(); var release = emnuAcad.GetValue("Release"); if (release == null) { return; } string[] strVer = release.ToString().Split(‘.‘); var pro = new AcadProductKey() { ProductKey = emnuAcad, Location = location, ProductName = productname, Version = double.Parse(strVer[0] + "." + strVer[1]), }; Dirs.Add(pro); } } catch { } } } public struct AcadProductKey { /// <summary> /// 注册表位置 /// </summary> public RegistryKey ProductKey; /// <summary> /// cad安装路径 /// </summary> public string Location; /// <summary> /// cad名称 /// </summary> public string ProductName; /// <summary> /// cad版本号 17.1之类的 /// </summary> public double Version; } } }