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

Windows Forms Discussion :

Exécutable dans une fenêtre MDI


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Exécutable dans une fenêtre MDI
    Le titre dit pas mal tout!

    J'aimerais savoir si quelqu'un connait la méthode pour créer une fenêtre MDI qui contient un exécutable quelconque (exemple concret : Adobe Reader).

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je suis tombé l'autre jour sur un post qui décrivait quelque chose comme ça... je n'arrive pas à remettre la main dessus, mais si je le retrouve je t'enverrai le lien.

    Le principe était le suivant : tu lances l'exécutable avec Process.Start, puis tu définis la fenêtre MDI comme parent (API SetParent) de la fenêtre principale de l'exécutable (Process.MainWindowHandle), en changeant éventuellement le style (API SetWindowLong), par exemple pour supprimer la bordure.

    J'avais testé, ça marche assez bien... je vais voir si je retrouve le code de mon test

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bon, j'ai retrouvé mon code. C'est du C#, je te laisse le soin de traduire...

    Tu auras besoin des déclarations d'API suivantes :
    Code C# : 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
     
            [DllImport("user32.dll")]
            static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
     
            [DllImport("user32.dll")]
            static extern int MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
     
            [DllImport("user32.dll")]
            static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
     
            [DllImport("user32.dll")]
            static extern int PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
     
            const int GWL_STYLE = -16;
            const int WS_VISIBLE = 0x10000000;
            const int WM_CLOSE = 0x00000010;

    Pour démarrer le process et l'afficher dans la form MDI :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                appProcess = new Process();
                appProcess.StartInfo = new ProcessStartInfo(chemin_exe, parametres);
                appProcess.Start();
                appProcess.WaitForInputIdle();
                appWindowHandle = appProcess.MainWindowHandle;
                SetParent(appWindowHandle, mdiForm.Handle);
                SetWindowLong(appWindowHandle, GWL_STYLE, (IntPtr)WS_VISIBLE);
                MoveWindow(appWindowHandle, 0, 0, this.Width, this.Height, true);

    En cas de redimensionnement de la Form MDI :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            protected override void OnResize(EventArgs e)
            {
                if (appWindowHandle != IntPtr.Zero)
                {
                    MoveWindow(appWindowHandle, 0, 0, this.Width, this.Height, true);
                }
                base.OnResize(e);
            }

    Pour arrêter le programme :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                if (appWindowHandle != IntPtr.Zero)
                {
                    PostMessage(appWindowHandle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
                }

Discussions similaires

  1. [WD10] Afficher un état dans une fenêtre MDI mère
    Par GodGives dans le forum WinDev
    Réponses: 0
    Dernier message: 05/04/2010, 13h35
  2. Réponses: 1
    Dernier message: 21/12/2007, 21h27
  3. Comment fermer une fenêtre Child dans une application MDI
    Par bahiatoon dans le forum C++Builder
    Réponses: 9
    Dernier message: 05/10/2006, 08h57
  4. [VB.NET] image d'un bouton dans un panel dans une fentre MDI
    Par smedini dans le forum Windows Forms
    Réponses: 6
    Dernier message: 02/02/2006, 18h15
  5. Réponses: 11
    Dernier message: 06/12/2005, 08h23

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