IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Soucis pour récupérer une fenêtre


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut Soucis pour récupérer une fenêtre
    Bonjour,
    j'ai développé une petite application qui permet d'afficher un exe dans le panel de ma Form, j'ai lancé le processus avec process.start et puis je peux récupérer le handle de l'application avec Findwindow et l'intégrer dans le panel avec le setParent.
    Tout parait bon, mais mon problème est que le process.start prend un peu de temps pour lancer le processus, donc le Findwindow lorsqu'elle cherche les handles affichés elle ne peut pas récuperer le handle de mon exe car il n'est pas encore affiché
    Voici le code
    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    processStartInfo = new System.Diagnostics.ProcessStartInfo();
    newProcess = new System.Diagnostics.Process();
     processStartInfo.FileName = "MyApp.exe";
     
    try
     {
     // Start the process
     newProcess = System.Diagnostics.Process.Start(processStartInfo);
     
     // Wait for process to be created and enter idle condition
     newProcess.WaitForInputIdle();
     ////// Get the main handle
     //appWin = newProcess.MainWindowHandle;
     }
     catch (Exception ^ex)
     {
    .....
     
     }
     existNewProcess = true;
     
     
    //System.Threading.Thread.Sleep(2000);
     IntPtr handle = FindWindow(null,"MyApp");
     
     // Put it into this form
     SetParent(handle, this.panel_VA.Handle);
     const int WM_SYSCOMMAND = 274;
    const int SC_MAXIMIZE = 61488;
     SendMessage(handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
    Le System.Threading.Thread.Sleep(2000); n'est pas valable car je sais pas combien faut t-il attendre
    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    simple, tu fais du polling

    Tant que t'as pas trouvé ton handle de fenêtre, tu continues à essayer de le récupérer...

    Comme cela, t'auras pas à attendre un temps prédéterminé !!!

  3. #3
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    Merci pour l'idée, j'ai déjà essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IntPtr handle = FindWindow(null,"MyApp");
      while (Equals(nullptr,handle))
      handle = FindWindow(null,"MyApp");
    mais ça n'a pas marché

  4. #4
    Membre actif
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 71
    Par défaut
    salut,

    Et en utilisant la propriété Responding de ton Process pour faire la boucle d'attente ?

  5. #5
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    ni pour Responding
    ni pour IsWindowVisible

    Merci

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    pourquoi faire un FindWindow alors que tu lances toi même le process ?

    Le code suivant fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    exe = Process.Start(@"notepad.exe");
                exe.WaitForInputIdle();
                IntPtr handle = exe.MainWindowHandle;
     
                SendMessage(handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);

  7. #7
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IntPtr handle = exe.MainWindowHandle;
    permet de récupérer le handle de processus et nom la fenêtre de l'application, et le handle récupéré ici na pas pu être intégrée, or le handle récupéré avec le findwindow est intégré
    Si tu remarque bien j'ai mis cette ligne en commentaire,
    Merci

  8. #8
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,
    Merci pour l'idée, j'ai déjà essayé ceci
    IntPtr handle = FindWindow(null,"MyApp"); while (Equals(nullptr,handle)) handle = FindWindow(null,"MyApp");
    mais ça n'a pas marché
    Si tu boucle sans fin, insère System.Threading.Thread.Sleep(200) dans le While.

  9. #9
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Citation Envoyé par 3aychoucha Voir le message
    Bonjour,
    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IntPtr handle = exe.MainWindowHandle;
    permet de récupérer le handle de processus et nom la fenêtre de l'application, et le handle récupéré ici na pas pu être intégrée, or le handle récupéré avec le findwindow est intégré
    Si tu remarque bien j'ai mis cette ligne en commentaire,
    Merci
    ???

    Chez moi ça s'intègre très bien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
     
    //...
     
    Process exe = Process.Start(@"notepad.exe");
    exe.WaitForInputIdle();
    IntPtr handle = exe.MainWindowHandle;
     
    Form1.SetParent(handle, this.panel1.Handle);
    Images attachées Images attachées  

  10. #10
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    cs_ntd;
    C'est vrai, pour notePad pas de problème mais essaye d'intégrer une application développée en MFC avec visual studio 2010 style office ou windows 7 et ça ne marchera pas et en fait c'est ce que je veux intégrer moi
    Grafitto;
    System.Threading.Thread.Sleep(2000) dans le while ne change rien, je l'ai utiliser avant le set pour attendre un peu (2 secondes) mais 2secondes n'ont aucun sens car ça dépend des performances du PC
    D'autres idées sont les très bienvenues
    Merci d'avance

  11. #11
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Salut,

    En effet, ça ne marche pas toujours

    Par contre, ton premier code marche très bien chez moi... Je veux dire que j'ai essayé avec des applications "complexes" (style office 2010, fenêtres custom, ...), je n'ai pas eu le moindre souci

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IntPtr handle = new IntPtr(0);
    Process exe = Process.Start(@"myApp.exe");
    exe.WaitForInputIdle();
    handle = FindWindow(null, "myApp");
    SetParent(handle, this.panel1.Handle);
    En utilisant ceci comme DllImports :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
     
    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    Y a-t-il moyen d'avoir le code de myApp, ou au pire l'exe, pour tester ?

  12. #12
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour, et merci
    ça me semble vraiment bizarre que même le premier code marche chez vous car chez moi ça ne marche plus
    My app est une très simple application (vide, ne contient aucun code) MFC avec visual studio 2010 style office avec Ribbon
    et elle ne s'affiche pas dans le panel
    et le problème est que le processus prend un temps pour ce lancer donc le findwindow ne trouve rien
    Merci

  13. #13
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Bon alors, j'ai fais une appli MFC "vide" sous VS2010 pour tester. Et le fait est que : ça ne marche pas aussi bien

    En effet, l'évènement WaitForInputIdle est envoyé trop vite je pense, du coup on cherche à capturer un handle qui n'existe pas encore...

    En revanche, si je met en place un while (bien bourrin), je retrouve le handle au bout de quelques cycles...


    Le code est le même que précedement, sauf au niveau du FindWindow :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(handle.ToInt32() == 0)
    {
        handle = FindWindow(null, "myApp");
    }
    Si tu veux, mes 2 projets en PJ. Il y a peu être un petit truc de configuration qu'il faut changer...

    A+
    Fichiers attachés Fichiers attachés

  14. #14
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    Merci cs_ntd pour votre tentative mais désolé ça ne marche pas pour votre projets aussi
    et donc le problème reste tjrs le même
    Merci

  15. #15
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut


    Voilà qui est étrange !!! Juste par curiosité, tu es sous quel OS ? XP, Vista, 7 ? Moi je suis sous XP, peut-être qu'il y a des différences dans les autres OS...

  16. #16
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    Je suis sur 7
    j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Thread.Sleep(1000);
    dans le while et ça marche
    c'est ce que m'a dit Graffito mais il fallait juste augmenter un peu le temps ( je ne sais pas pourquoi )
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/08/2006, 21h39
  2. Réponses: 11
    Dernier message: 13/07/2006, 17h15
  3. Réponses: 2
    Dernier message: 14/04/2006, 19h40
  4. Réponses: 5
    Dernier message: 09/09/2005, 18h51
  5. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo