IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

intégration appli externe dans un Winform


Sujet :

Dotnet

  1. #1
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut intégration appli externe dans un Winform
    Bonjour !

    j'ai une double question... est-il possible de faire en sorte de lancer une application externe (que ce soit un naviguateur ou un logiciel de dessin, une visionneuse de diapos.. ) dans un windows form (et non pas depuis...) ; c'est à dire à la manière des forms MDI child / parent ?

    et si oui, comment le faire ? j'ai fait des tests avec des process, formulaires mdiChild... l'application en question ( en l'occurence un visionneur 3D) se lance en dehors du form MDI parent.

    merci de votre aide =)

  2. #2
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    Salut, je ne sais pas s'il existe une solution directement avec le framework .NET mais tu peux faire ce genre de chose avec l'API windows Setparent : http://msdn.microsoft.com/fr-fr/libr...,VS.85%29.aspx

  3. #3
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Merci pour ton lien Pascal mais malheureusement c'est un peu vieux et je n'ai pas réussi à trouver une correspondance actuelle... personne d'autres n'a d'idées ?

  4. #4
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    Si ça peut t'aider voilà un exemple d'utilisation de cette API sur le site pinvoke.net :

    http://www.pinvoke.net/default.aspx/...SetParent.html

  5. #5
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    la base pour pouvoir utiliser tes exemples est cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [DllImport("user32.dll")]
    or, sous VS 2010 cette fonction (dllimport) n'existe pas, ou en tout cas je ne l'ai pas trouvée ; j'ai cherché par les "using System.*" mais je n'ai rien vu qui ressemble à "User32" ... il m'est donc impossible d'utiliser la fonction SetParent !
    j'espère que j'ai été clair cette fois

  6. #6
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    Ca ne fait pas partie des choses que j'ai essayé avec VS2010 mais ça me surprendrait énormément que cet attribut n'existe plus ou que MS ait changé son nom.
    As-tu essayé ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [System.Runtime.InteropServices.DllImport("user32.dll")]

  7. #7
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Runtime.InteropServices.DllImportAttribute("user32.dll");
    effectivement ca fonctionne mieux avec ca ! juste la petite modif sur dllImport.
    par contre je trouve toujours pas de fonction SetParent... je continue à chercher merci pour ton aide Pascal

  8. #8
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    J'ai l'impression que tu utilises mal l'attribut dans ton dernier message. Voilà un rapide exemple de déclaration/utilisation type d'une API :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public class Class1
        {
            [System.Runtime.InteropServices.DllImport("user32.dll")]
            private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
     
            public void Test()
            {
                IntPtr result = SetParent(...);
            }
        }
    Après pour savoir quoi mettre aux 2 paramètres de SetParent tu peux t'inspirer de l'exemple sur pinvoke.net que j'ai passé tout à l'heure.

  9. #9
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    ok j'ai testé ce que tu m'as donné, et je crois que tu as mal compris ma question...
    Je voudrais lancer une application totalement externe, sur laquelle je n'ai aucun accès au code, tel que adobe reader, paint, Firefox... par exemple ; donc les lancer depuis mon appli .net (jusque la très simple... un simple Process.Start), mais aussi que ce logiciel s'ouvre dans la fenêtre de mon appli .Net !

    je vais essayer d'exprimer ca avec un montage image...

  10. #10
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    Non non c'est bien pil poil ce que j'avais compris . Pour la petite anecdote j'ai déjà eu à faire ce genre de chose il y a longgggggggtemps en VB6 avec une de mes applis qui utilisait un logiciel de carto dont je n'avais justement pas le code source. Visuellement on avait l'impression que le logiciel était juste un composant qui faisait partie intégrante de mon programme.

    Si tu fait bien attention à l'exemple sur pinvoke.net tu verras que ce bout de code lance le NotePad.exe de windows (donc une appli externe) et l'intègre ensuite dans sa propre Form.

  11. #11
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    d'abord, merci pour toute ton aide pascal !!!

    ensuite... j'ai quasi copié collé le code, mais ca ne fonctionne pas pour moi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public partial class fm_viewer : Form
        {
            [System.Runtime.InteropServices.DllImport("user32.dll")]
            internal static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    private void toolStripButton1_Click(object sender, EventArgs e)
            {
                this.SuspendLayout();
     
                string appli = "Notepad.exe";
                Process viewer = new Process();
     
                viewer.StartInfo.FileName = appli;
                viewer.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
     
                viewer.Start();
                SetParent(viewer.MainWindowHandle, this.Handle);
                this.ResumeLayout();
     
            }
    j'dois être maudit...

  12. #12
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
        public partial class Form1 : Form
        {
            [DllImport("user32.dll")]
            private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
     
            [DllImport("user32.dll")]
            private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void btnRun_Click(object sender, EventArgs e)
            {
                Process p = Process.Start(@"C:\Program Files\Notepad++\notepad++.exe");
                p.WaitForInputIdle();
     
                SetParent(p.MainWindowHandle, this.Handle);
     
                SetWindowPos(p.MainWindowHandle, IntPtr.Zero, 50, 50, 600, 500, 0);
            }
        }
    Sans l'appel à la méthode WaitForInputIdle() ça ne marche pas non plus chez moi.
    Tu remarqueras au passage l'utilisation de l'API SetWindowPos qui te permet de modifier - entre autres - la taille et position de la fenêtre. Je me suis dis que ça pourrait te servir
    J'ai essayé avec Notepad.exe et Notepad++ et ça marche comme tu peux le voir sur cette capture :


  13. #13
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    merci ! effectivement ca fonctionne pour un certain nombre d'applications, mais le principal logiciel que je souhaitais pouvoir gérer.. doit être bardé de protections, c'est le visionneur d'autocad, dwgTrueView... donc ca ne fonctionne pas pour lui.
    Merci quand même pour tout !!!

  14. #14
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    ...doit être bardé de protections
    Même pas, faut creuser le truc un peu plus loin c'est tout



    Comme tu peux le voir ça marche, mais effectivement pas avec le code que je t'avais passé. D'après ce que j'ai vu, c'est le splashscreen qui fout le bordel au démarrage de l'appli. Il y a plusieurs façons de contourner le problème avec dwgTrueView. En voilà une :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void btnRun_Click(object sender, EventArgs e)
    {
        Process p = Process.Start(@"C:\Program Files\DWG TrueView 2010\DWGVIEWR.exe");
        p.WaitForInputIdle();
        while (p.MainWindowHandle == IntPtr.Zero || string.IsNullOrEmpty(p.MainWindowTitle))
        {
            Thread.Sleep(100);
            p.Refresh();
        }
        SetParent(p.MainWindowHandle, panelAutodesk.Handle); 
    }
    Dans cet exemple, un panel tout ce qu'il y a de plus classique "panelAutodesk" est utilisé comme "container" de l'appli. C'est juste pour te montrer qu'on peut mettre l'appli dans un composant de la Form et pas obligatoirement dans la Form elle même.

  15. #15
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    ah oui ! ca c'est géant ! merci
    en plus en le mettant dans un panel ca me laisse la place de gérer un barre d'outils, boutons de naviguations...

    encore merci pour tes explications !!!

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Integrer lapplication de flir tools dans un winform en vb ou c#
    Bonsoir Pascal au faite jai utiliser votre code sa fonction pour boucoup d'application mais jai essayer avec l'application de flir tools là sa fonctione pas j'ai besoin de votre aide.
    Merci D'avance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] Intégrer une application externe dans un Winform
    Par chr.colle dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/12/2010, 17h15
  2. Inclure un programme externe dans une winform
    Par furtif1 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/05/2010, 00h17
  3. Intégration image externe en paramètres dans reportviewer
    Par penchu dans le forum Windows Forms
    Réponses: 1
    Dernier message: 08/02/2007, 20h35
  4. Réponses: 3
    Dernier message: 26/09/2005, 11h41
  5. [8.0] Intégration de PostGreSQL dans une appli windows
    Par Didier69 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 27/01/2005, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo