Aller au contenu

Ouvrir AutoCAD avec WPF


Messages recommandés

Bonjour,

 

J'utilise Autocad 2018 et j'essaie de l'ouvrir avec une fenêtre WPF mais cela ne fonctionne pas.

 

J'ai fais mes recherche et il y a des trucs qui ne marche pas

 

Recherche

 

 

Voici le code

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000016-0000-0000-C000-000000000046")]

   public interface IMessageFilter
   {
       [PreserveSig]
       int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo);
       [PreserveSig]
       int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType);
       [PreserveSig]
       int MessagePending(
       IntPtr hTaskCallee, int dwTickCount, int dwPendingType);
   }
   /// <summary>
   /// Interaction logic for MainWindow.xaml
   /// </summary>
   public partial class MainWindow : Window, IMessageFilter
   {
       [DllImport("ole32.dll")]
       static extern int CoRegisterMessageFilter(IMessageFilter lpMessageFilter, out IMessageFilter lplpMessageFilter);

       public MainWindow()
       {
           InitializeComponent();
           IMessageFilter oldFilter;
           CoRegisterMessageFilter(this, out oldFilter);
       }

       private void btnCreer_Click(object sender, RoutedEventArgs e)
       {

           const string productid = "autocad.application.22";
           AcadApplication acApp = null;
           try
           {
               acApp = (AcadApplication)Marshal.GetActiveObject(productid);
           }
           catch
           {
               try
               {
                   Type acType = Type.GetTypeFromProgID(productid);

                   acApp = (AcadApplication)Activator.CreateInstance(acType, true);

               }
               catch
               {

                   MessageBox.Show("cannot create object of type \"" + productid + "\"");
               }
           }
           if (acApp != null)
           {
               acApp.Visible = true;

           }           
       }

       #region IMessageFilter Members

       int IMessageFilter.HandleInComingCall(
         int dwCallType, IntPtr hTaskCaller,
         int dwTickCount, IntPtr lpInterfaceInfo
       )
       {
           return 0; // SERVERCALL_ISHANDLED
       }

       int IMessageFilter.RetryRejectedCall(
         IntPtr hTaskCallee, int dwTickCount, int dwRejectType
       )
       {
           return 1000; // Retry in a second
       }

       int IMessageFilter.MessagePending(
         IntPtr hTaskCallee, int dwTickCount, int dwPendingType
       )
       {
           return 1; // PENDINGMSG_WAITNOPROCESS
       }
       #endregion
   }

 

 

est ce que qu'elle qu'un aurait une solution?

 

Merci,

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Comme je ne sais pas ce que tu entends par : "ça ne fonctionne pas", je te donne un exemple simple qui fonctionne (en tous cas chez moi).

 

Le fait d'utiliser la liaison tardive (late binding) avec le type dynamic permet de ne pas avoir à référencer les bibliothèque COM qui sont dépendantes des versions majeures d'AutoCAD et de la plateforme. L'inconvénient, c'est qu'on a plus d'intellisense, mais pour ce genre de test ça suffit bien.

 

    public partial class MainWindow : Window
   {
       public MainWindow()
       {
           InitializeComponent();
       }

       private void OpenAcad(object sender, RoutedEventArgs e)
       {
           const string productid = "AutoCAD.Application.22";
           dynamic acApp;
           try
           {
               acApp = Marshal.GetActiveObject(productid);
           }
           catch
           {
               try
               {
                   acApp = Activator.CreateInstance(Type.GetTypeFromProgID(productid), true);
               }
               catch
               {
                   MessageBox.Show("Cannot create object of type \"" + productid + "\"");
                   return;
               }
           }

           // boucle tant qu'AutoCAD n'est pas démarré et visible
           while (true)
           {
               try { acApp.Visible = true; break; }
               catch { }
           }

           // maximise la fenêtre AutoCAD
           acApp.WindowState = 3; // AcWindowState.acMax;
       }
   }

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité