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 :

Process.Start(..) et MainWindowHandle


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de dsolheid
    Inscrit en
    Décembre 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Décembre 2007
    Messages : 141
    Par défaut Process.Start(..) et MainWindowHandle
    Bonjour,

    J'ai une petite application en C#/.NET qui lance d'autres applications et qui conserve une référence vers les processus.

    Une fois le processus lancé (une application), je récupère l'instance Process et j'aimerais retrouver son WindowHandle pour pouvoir connaître les dimensions de la fenêtre.

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Process p = new Process();
    p = Process.Start(app, param);
    puis après je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tagWINDOWINFO wii = new tagWINDOWINFO();
    GetWindowInfo(_p.MainWindowHandle, ref wii);
    Mais voilà, ces deux bouts de code sont appelés des dizaines de fois .. à la suite.
    Et parfois, j'ai l'impression que l'instance p (de Process) n'a pas eu le temps d'être complètement initialisée ..

    Parfois le MainWindowHandle vaut zéro .. parfois pas ..

    J'ai donc ajouté une boucle avant de l'utiliser ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                            do
                            {
                                p.Refresh();
                                Thread.Sleep(100);
                                handle = (int)p.MainWindowHandle;
                            }
                            while (handle == 0);
    Mais ca ne va pas mieux ..
    Car c'est carrément l'instance 'p' qui ne vaut rien ..

    J'ai ressayé avec "WaitForInputIdle" mais ca n'attend rien du tout !

    Avez vous déjà eu ça ?

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Code c# : 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    [DllImport("user32.dll")]
    		[return: MarshalAs(UnmanagedType.Bool)]
    		static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
     
    		[StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int Left;    
                public int Top;    
                public int Right;    
                public int Bottom;
     
    			public override string ToString()
    			{
    				return String.Format("{0},{1},{2},{3}",Left,Top,Right,Bottom);
    			}
            }
     
     
    		void Button1Click(object sender, EventArgs e)
    		{
    			Process p = Process.Start("notepad.exe");
    			p.WaitForInputIdle();
    			const int max_try = 20;
    			int try_count = 0;
    			while(p.MainWindowHandle == IntPtr.Zero && try_count < max_try && !p.HasExited)
    			{
    				System.Threading.Thread.Sleep(100);
    			}
    			if(p.MainWindowHandle != IntPtr.Zero)
    			{
    				RECT c = new RECT();
    				if(GetWindowRect(p.MainWindowHandle, out c))
    				{
    					MessageBox.Show(c.ToString());
    				}
    				else
    					MessageBox.Show("GetWindowRect Error");
    			}
    			else
    				MessageBox.Show("MainWindowHandle = Zero");
    		}
    Il y a simplement des fois où le MainWindowHandle n'est pas définis. Avec notepad ça marche toujours, avec explorer ça ne semble pas marcher.
    Après si tu veux absolument avoir toutes les fenêtres qui appartiennent à un processus il doit y avoir un moyen ...

  3. #3
    Membre confirmé Avatar de dsolheid
    Inscrit en
    Décembre 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Décembre 2007
    Messages : 141
    Par défaut
    Citation Envoyé par smyley Voir le message
    .....
    Il y a simplement des fois où le MainWindowHandle n'est pas définis. Avec notepad ça marche toujours, avec explorer ça ne semble pas marcher.
    Après si tu veux absolument avoir toutes les fenêtres qui appartiennent à un processus il doit y avoir un moyen ...
    Bonjour,

    Merci pour la réponse.

    En fait, j'ai joué un petit peu avec ce genre de technique ... (en essayant de laisser le temps lors de la création du process, délai après, etc .....)
    Je remarque qu'en mode PAS à PAS (cad avec un breakpoint dans le code de création), les propriétés de mon object Process sont bien définies. Et en exécution continue, j'ai des soucis.

    Je reçois une exception (avec votre procédé, mais avec le mieux aussi) =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _p.MainWindowHandle = '_p.MainWindowHandle' threw an exception of type 'System.InvalidOperationException'
    En regardant de plus près, je vois que toutes propriétés de mon objet Process sont notées : '_p.BasePriority' threw an exception of type 'System.InvalidOperationException'
    pareil pour ExitCode, pour ExitTime, etc .... et idem pour MainWindowHandle du coup...

    Je ne vois pas trop d'où vient le stuuut.

    D'avance merci !

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Ca c'est bizarre. Chez moi je n'avais aucune exception.
    Quel programme essayes-tu de lancer via cette méthode ?
    Peut être aussi que le programme en question s'est déjà avant l'appel de p.MainWindowHandle ...

  5. #5
    Membre confirmé Avatar de dsolheid
    Inscrit en
    Décembre 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Décembre 2007
    Messages : 141
    Par défaut
    Citation Envoyé par smyley Voir le message
    Ca c'est bizarre. Chez moi je n'avais aucune exception.
    Quel programme essayes-tu de lancer via cette méthode ?
    Peut être aussi que le programme en question s'est déjà avant l'appel de p.MainWindowHandle ...


    Shame on ME !!!!

    En fait, je viens seulement de capter ..

    L'application que je lance X fois .. ne plante pas seule ..
    Mais une fois qu'il y a X instance, il se peut qu'elle utilise des fichiers de données identiques, et donc, il y a un accès concurrent qui parfois jette une exception (non gérée au sein de l'application).
    Du coup, l'app crash .. et mon programme qui lance les process ...ne vérifie pas que le process s'est terminé, et il essaye de faire quelque chose avec ...

    cqfd.

    Désolé pour le temps perdu ...

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

Discussions similaires

  1. Diagnostics.Process.Start() et MainWindowHandle
    Par CDScsk dans le forum VB.NET
    Réponses: 0
    Dernier message: 13/09/2010, 18h17
  2. [VB.NET 1.1] Ping silencieux avec Process.Start()
    Par toniolol dans le forum Windows Forms
    Réponses: 6
    Dernier message: 30/09/2008, 13h35
  3. Réponses: 3
    Dernier message: 27/09/2007, 13h55
  4. Process.Start génère une erreur
    Par jerome.fortias dans le forum C#
    Réponses: 6
    Dernier message: 17/09/2007, 15h31
  5. Problème de Process.Start depuis une page ASPX
    Par LudVichzme dans le forum ASP.NET
    Réponses: 3
    Dernier message: 30/04/2007, 20h05

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