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).
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).
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
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
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); }
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager