[API user32] Problème fonction SetParent [Résolu]

Messages postés
7
Date d'inscription
lundi 12 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2007
- - Dernière réponse : goddet
Messages postés
7
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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
2369
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
12
3
Merci
Des constantes :

SWP_NOSIZE = 0x0001;
SWP_SHOWWINDOW = 0x0040;

::|The S@ib|::
MVP C#.NET

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 154 internautes nous ont dit merci ce mois-ci

Commenter la réponse de TheSaib
Messages postés
7
Date d'inscription
lundi 12 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2007
3
Merci
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!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 154 internautes nous ont dit merci ce mois-ci

Commenter la réponse de goddet
Messages postés
2369
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
12
0
Merci
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
Commenter la réponse de TheSaib
Messages postés
7
Date d'inscription
lundi 12 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2007
0
Merci
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?
Commenter la réponse de goddet
Messages postés
7
Date d'inscription
lundi 12 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2007
0
Merci
Nikel! Merci! Je te tiens au courant dés que j'ai testé!
Commenter la réponse de goddet