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

goddet 7 Messages postés lundi 12 mars 2007Date d'inscription 5 novembre 2007 Dernière intervention - 31 oct. 2007 à 16:25 - Dernière réponse : goddet 7 Messages postés lundi 12 mars 2007Date d'inscription 5 novembre 2007 Dernière intervention
- 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
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 2 nov. 2007 à 10:48
3
Merci
Des constantes :

SWP_NOSIZE = 0x0001;
SWP_SHOWWINDOW = 0x0040;

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

Merci TheSaib 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de TheSaib
Meilleure réponse
goddet 7 Messages postés lundi 12 mars 2007Date d'inscription 5 novembre 2007 Dernière intervention - 5 nov. 2007 à 17:35
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!

Merci goddet 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de goddet
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 31 oct. 2007 à 17:58
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
goddet 7 Messages postés lundi 12 mars 2007Date d'inscription 5 novembre 2007 Dernière intervention - 2 nov. 2007 à 08:31
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
goddet 7 Messages postés lundi 12 mars 2007Date d'inscription 5 novembre 2007 Dernière intervention - 2 nov. 2007 à 15:57
0
Merci
Nikel! Merci! Je te tiens au courant dés que j'ai testé!
Commenter la réponse de goddet

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.