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

Windows Forms Discussion :

[Process] Manipuler la fenêtre d'un process


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Points : 89
    Points
    89
    Par défaut [Process] Manipuler la fenêtre d'un process
    Bonjour,

    Je développe une application destinée à des personnes pour certaines peu averties des subtilités informatiques J'ai constaté que lors de l'utilisation de mon soft, ces dernières le lancent n fois sans forcément sans rendre compte. En gros dès qu'ils en ont besoin, ils double cliquent sur l'icône du bureau alors qu'il est peut être déjà ouvert.

    Pour pallier à ça, j'aimerais que mon appli ne se lance qu'une fois (déjà fait et fonctionnel) et surtout qu'elle ramène la fenêtre principale du process éventuellement déjà existant dans la gueule du user. Ni vu, ni connu.

    Voici le code existant au lancement de l'appli.

    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
    [DllImport("user32.dll")]
    public static extern int OpenIcon(int iHwnd);
     
    /// <summary>
    /// Point d'entrée principal de l'application.
    /// </summary>
    [STAThread]
    static void Main() 
    {
    	using (Skybound.VisualStyles.VisualStyleContext.Create())
    	{
    		// If the same process name is found, a second instance isn't allowed
    		Process[] aobjProcesses = Process.GetProcessesByName(
    			Process.GetCurrentProcess().ProcessName,
    			Environment.MachineName);
    		if (aobjProcesses.Length > 1)
    		{
    			CimpaBox.ShowInformation("PF Loader is already running on this computer.");
    			OpenIcon(aobjProcesses[0].MainWindowHandle.ToInt32());
    			return;
    		}
     
    		Application.Run(new FrmMain());
    	}
    }
    J'affiche donc une petite MessageBox d'info avant d'essayer de ramener au dessus des autres la fenêtre principale (et unique) de l'exe déjà lancé. J'ai ici essayé l'utilisation de la méthode OpenIcon mais cela ne fonctionne pas.

    Quelqu'un aurait une idée ? N'hésitez pas à me demander des détails/reformulations si nécessaire. Merci d'avance !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Points : 89
    Points
    89
    Par défaut
    Re-bonjour à tous,

    Je viens de trouver la solution et la poste ici (ça peut toujours servir). Le code correct est le suivant :

    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
    [DllImport("user32.dll")]
    public static extern int SetForegroundWindow(int iHwnd);
     
    /// <summary>
    /// Point d'entrée principal de l'application.
    /// </summary>
    [STAThread]
    static void Main() 
    {
    	using (Skybound.VisualStyles.VisualStyleContext.Create())
    	{
    		// If the same process name is found, a second instance isn't allowed
    		Process[] aobjProcesses = Process.GetProcessesByName(
    			Process.GetCurrentProcess().ProcessName,
    			Environment.MachineName);
    		if (aobjProcesses.Length > 1)
    		{
    			foreach (Process objProcess in aobjProcesses)
    			{
    				// Check the process isn't the current one
    				if (objProcess.Id == Process.GetCurrentProcess().Id)
    					continue;
     
    				SetForegroundWindow(objProcess.MainWindowHandle.ToInt32());
    				return;
    			}
    		}
     
    		Application.Run(new FrmMain());
    	}
    }
    J'ai décidé de ne plus afficher de message d'erreur et de directement afficher la fenêtre existante.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/01/2010, 22h27
  2. [vs 2005]réduire une fenêtre lancée par Process
    Par tatikambwa dans le forum C#
    Réponses: 1
    Dernier message: 28/10/2008, 15h02
  3. [D 2005][Générateur d'état]Manipuler la fenêtre du preview
    Par Giovanny Temgoua dans le forum Delphi
    Réponses: 4
    Dernier message: 11/10/2006, 16h43
  4. Comment manipuler une fenêtre fille ?
    Par David.V dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/06/2006, 10h35
  5. Manipuler les fenêtre d'un shell en c
    Par Gential dans le forum C
    Réponses: 2
    Dernier message: 24/10/2003, 10h04

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