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.