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 :

Champ MainwindowTitle vide


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut Champ MainwindowTitle vide
    Bonjour,

    Après une demi-journée de recherche je me décide a posté sur votre forum. Voici mon problème :

    Je dois créer en C# une appli me permettant de détecter l'ouverture d'une application externe, afin de ne pas l'ouvrir une deuxième fois si celle-ci est déjà ouverte, mais d'afficher à l'écran l'instance en cours.

    Actuellement, j'ai réussi à récupérer la liste des processus ainsi qu'à détecter la présence en barre des tâches d'une fenêtre de l'application que je ne dois pas ouvrir plusieurs fois.

    Mon problème se situe au niveau de l'affichage de l'appli externe, je rencontre un dys-fonctionnement dans mon programme dans la mesure ou certaines fois ou il détecte bien la présence d'une instance de l'application externe mais ne parvient pas à me l'afficher, suite à mes investigations j'ai constaté que les fois ou il n'arrivait pas à afficher l'application c'était lorsque le champ "WindowMainTitle" était vide, bien que ce champ ne me serve qu'à tester la précense d'une fenêtre ouverte et non pas à l'affichage de cette fenêtre.

    Pour être plus précis dans les renseignement, la première que je lance l'application, la fonction GetProcesses() me retourne correctement tous les processus en cours, mais si je lance mon programme une deuxième fois, les champs WindowsMainTitle récupéré sont tous vides. je ne comprends pas pourquoi, mais je pense que l'erreur se situe a ce niveau la.

    Par avance merci à ceux qui me consacreront un peu de leur temps.

    Pour mon 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    private void Form1_Load(object sender, EventArgs e)
    {
          Process proc = new Process();
          try
          {
              Process[] prc = Process.GetProcesses();
              bool result= false ;
                    if (prc.Length >= 1)
                    {
                        try
                        {
                            foreach (Process Apex in prc)
                            {
                                if (Apex.ProcessName == "ProcessExplorer")
                                {
                                    Apex.Refresh();
     
                                    if (Apex.MainWindowHandle != IntPtr.Zero)
                                    {
                                        MessageBox.Show("Un Apex est déja ouvert.");
                                        SetForegroundWindow(Apex.MainWindowHandle);
                                        result = OpenIcon(Apex.MainWindowHandle);
     
     
                                        if (!Apex.MainWindowTitle.Equals("") && IsWindowVisible(Apex.MainWindowHandle))
                                        {
                                            MessageBox.Show("Un Apex est déja ouvert.");
                                            SetForegroundWindow(Apex.MainWindowHandle);
                                            result = OpenIcon(Apex.MainWindowHandle);
                                        }
                                        else if (String.IsNullOrEmpty(Apex.MainWindowTitle.ToString()))
                                        {
                                            MessageBox.Show("Un Apex est déja ouvert.");
                                        }
                                    }
                                    else
                                    {
                                        Apex.Kill();
                                    }
                                }
                            }
     
                            if (result == false)
                            {
                                proc.StartInfo.FileName = @"C:\Program Files\AspenTech\APEx\Pe\ProcessExplorer.exe";
                                proc.StartInfo.UseShellExecute = false;
                                proc.Start();
                                proc.Close();
                            }
     
                            Application.Exit();
     
                        }
                        catch (Exception ex)
                        {
                            prc[0].Kill();
                            MessageBox.Show(ex.Message);
                        }
                        finally
                        {
                            prc[0].Close();
                        }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    proc.Close();
                    Application.Exit();
                }
    }
    PS : le programme est développé sous VS 2005 sur un Xp Pro.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut
    Trouvé,
    En fait le MainwindowTitle se vide lorsque pour X ou Y raison (dans mon cas il s'agit d'un changement d'état de l'application) le MainwindowHandle change, du coup l'affichage ne pouvait plus se faire. La solution n'est peux être pas très propre mais c'est un bon dépannage, il suffit d'écrire dans un fichiers le handle attribué à l'ouverture du programme, et de toujours ouvrir la fenêtre associée a ce handle. Pour fermer et ouvrir une autre instance on vide le fichier et on écrit le Handle de la nouvelle instance.

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

Discussions similaires

  1. Tester si champs est vide
    Par clems34 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/09/2005, 20h53
  2. Compter champs non vide
    Par szdavid dans le forum Oracle
    Réponses: 4
    Dernier message: 13/07/2005, 14h01
  3. champ date vide, requete
    Par w.b. dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 15/02/2005, 16h51
  4. [Access] Comment savoir qu'un champs est vide ?
    Par Oberown dans le forum ASP
    Réponses: 9
    Dernier message: 25/10/2004, 10h47
  5. [CR9] Bug avec les champs à valeur vide ?
    Par Djob dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/07/2003, 21h21

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