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).
Version imprimable
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
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:
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:
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:
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:
1
2
3
4 if (appWindowHandle != IntPtr.Zero) { PostMessage(appWindowHandle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); }