[API user32] Problème fonction SetParent

Résolu
goddet Messages postés 6 Date d'inscription lundi 12 mars 2007 Statut Membre Dernière intervention 5 novembre 2007 - 31 oct. 2007 à 16:25
goddet Messages postés 6 Date d'inscription lundi 12 mars 2007 Statut Membre Dernière intervention 5 novembre 2007 - 5 nov. 2007 à 17:35
Bonjour à tous,

J'essaie de réaliser une winform qui affiche dans un container (un panel par exemple) une application Windows comme notepad.
Un peu comme ici (avec la fonction pour manger un process!):
http://www.vbfrance.com/codes/MANIPULATION-PROCESS-HANDLES-OPTIONS-INEDITES_3706.aspx#

J'ai utilisé l'API user32 avec la fonction SetParent.
Mais le problème est que la fenetre de notepad n'est pas incluse dans la mienne même aprés utilisation de cette fonction.
J'essaie de faire :
//Ajout de la fonction SetParent de l'API user32
[DllImport("user32.dll", EntryPoint = "SetParent")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

//Ajout de la fonction SetWindowPos de l'API user32
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

//Ajout de la fonction ShowWindow de l'API user32
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

Panel monPanel = new System.Windows.Forms.Panel();
monPanel.SuspendLayout();
p = new Process();
p.StartInfo.FileName = "Notepad.exe";
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.Start();
SetParent(p.MainWindowHandle, panelOxymetre.Handle);
SetWindowPos(p.MainWindowHandle, p.MainWindowHandle, 0, 0, 150, 150, 0);
ShowWindow(p.MainWindowHandle, 5);
monPanel.ResumeLayout();

La fenetre de notepad apparait toujours au meme endroit à l'ecran et pas dans mon panel! Meme si je modifie les attributs des fonctions ShowWindow & SetWindowPos rien ne change!
Je ne comprends pas d'ou vient le problème! Si quelqu'un peut m'aider je suis preneur!!!!
Merci d'avance.
David

5 réponses

TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
2 nov. 2007 à 10:48
Des constantes :

SWP_NOSIZE = 0x0001;
SWP_SHOWWINDOW = 0x0040;

::|The S@ib|::
MVP C#.NET
3
goddet Messages postés 6 Date d'inscription lundi 12 mars 2007 Statut Membre Dernière intervention 5 novembre 2007
5 nov. 2007 à 17:35
Voila le resultat (testé avec Acrobat Reader):

                    IntPtr PgmExtHandle = new IntPtr(0);
                    Process p= null;
                    ProcessStartInfo info = new ProcessStartInfo("AcroRd32.exe");
                    info.WorkingDirectory = targetDir;
                    info.WindowStyle = ProcessWindowStyle.Normal;
                    info.CreateNoWindow = false;
                    p = Process.Start(info);
                    Thread.Sleep(2000);

                    //On récupère le handle du programme externe
                    string lpszParentClass = "AcroRd32"; //Nom du process
                    string lpszParentWindow = "Adobe Reader"; //Nom de la fenetre

                    PgmExtHandle = FindWindow(lpszParentClass, lpszParentWindow); //On peut passez 1 seul paramètre sur les 2 en mettant l'autre null ca marche aussi!

                    SetWindowPos(PgmExtHandle, new IntPtr(-2), 0, 0, panelTest.Width, panelTest.Height, SWP_SHOWWINDOW);
                    SetParent(PgmExtHandle, panelTest.Handle);

Voila voila! Merci a toi The Saib de m'avoir mis sur la piste et aussi a The Monz 31 pour son aide!
3
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
31 oct. 2007 à 17:58
Pas la peine de dédoubler ton message.

Tu as essayer de faire un findwindow sur ton notepad plutot que le MainWindowHandle et dans ton SetWindowPos lui passer comme paramètre SWP_SHOWWINDOW | SWP_NOSIZE.

::|The S@ib|::
MVP C#.NET
0
goddet Messages postés 6 Date d'inscription lundi 12 mars 2007 Statut Membre Dernière intervention 5 novembre 2007
2 nov. 2007 à 08:31
Merci pour ta réponse!
Désolé d'avoir doubler mon message mais comme je n'avais pas de réponse coté winform je me suis dit que je n'avais surement pas posté dans la bonne section!
Je test ça dés lundi! (Je n'est pas accés à mon pc avant!!!!)
Par contre je ne connais pas les 2 paramètres qu'il faut passer à SetWindowPos (SWP_SHOWWINDOW & SWP_NOSIZE).
Est-ce que ce sont des constantes qu'il faut déclarer ou des paramètres à récupérer?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
goddet Messages postés 6 Date d'inscription lundi 12 mars 2007 Statut Membre Dernière intervention 5 novembre 2007
2 nov. 2007 à 15:57
Nikel! Merci! Je te tiens au courant dés que j'ai testé!
0
Rejoignez-nous