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 :

Mettre un exe au premier plan d'une application


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Brésil

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 72
    Points : 47
    Points
    47
    Par défaut Mettre un exe au premier plan d'une application
    Salut! y-a t'il un moyen de laisser la fenêtre d'un exe lancé d'une application devant le formulaire de l'application.(Un bouton qui affichera Notepad par exemple mais Notepad devrait toujours être devant le formulaire même si l'on clique sur le formulaire la fenêtre du notepad reste à sa place et ne disparait pas en C#.
    J'ai pu afficher l'exe avec ce 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
       Process myProcess = new Process();
     
                try
                {
                    this.TopMost = false;
                    string winpath = Environment.GetEnvironmentVariable("windir");
                    myProcess.StartInfo.UseShellExecute = false;
                    myProcess.StartInfo.FileName = winpath+@"\system32\notepad.exe";
                    myProcess.StartInfo.CreateNoWindow = true;
     
                    myProcess.Start();
     
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Il existe un moyen, mais cela oblige d'aller taper dans l'Api Win32.

    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
    [DllImport("user32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, uint windowStyle);
     
    [DllImport("user32.dll")]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
     
    private void LaunchOnTop(string processPath)
    {
        Process process = new Process();
     
        process.StartInfo.FileName = processPath;
        process.Start();
        process.WaitForInputIdle();
     
        if (process != null)
        {
            ShowWindow(process.MainWindowHandle, 1u);
            SetWindowPos(process.MainWindowHandle, new IntPtr(-1), 0, 0, 0, 0, 3u);                
        }
    }
    A noter que cela fera en sorte que notepad sera au dessus de toutes les fenêtres. C'est-à-dire que tel quel, ce code fera en sorte que même si tu réduis la fenêtre de ton formulaire, notepad restera visible. Tu dois éventuellement pouvoir gérer la visibilité de notepad en fonction de la visibilité ou non de ton formulaire.

    Il est possible de faire beaucoup de choses avec les fenêtres :
    - il est possible de définir une relation mère/fille entre deux form afin que l'un soit toujours au dessus de l'autre. Mais il faut que cela soit deux form du même process ;
    - il est possible d'inclure une fenêtre d'un autre process au sein d'un formulaire (la fenêtre apparait alors comme un control de ton formulaire) ;
    - il est possible d'affiche toujours au dessus une fenêtre (c'est ce que fait le code que je t'ai transmis).

    Mais il n'est pas possible d'avoir une relation mère\fille entre deux fenêtres de deux process différents. D'où la complexité de ton cas.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    J'ai eu une révélation pour faire cela simplement :

    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
    public partial class Form1 : Form
    {
        private Form _container;
        private Process _process;
     
        public Form1()
        {
            InitializeComponent();            
        }      
     
        private void button1_Click(object sender, EventArgs e)
        {
            string processName = "notepad";
            LaunchOnTop(processName);
        }      
     
        [DllImport("user32.dll")]
        private static extern IntPtr SetParent(IntPtr childWindow, IntPtr parentWindow);
     
        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, uint windowStyle);
     
        [DllImport("user32.dll")]
        private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
     
        private void LaunchOnTop(string processPath)
        {
            Process process = new Process();
     
            process.StartInfo.FileName = processPath;
            process.Start();
            process.WaitForInputIdle();
            _process = process;
     
            if (process != null)
            {
                OnTop();             
            }
        }    
     
        private void OnTop()
        {
            _container = new Form();
            _container.ResizeEnd += _container_Resize;
            _container.Show(this);            
            SetParent(_process.MainWindowHandle, _container.Handle);
            ShowWindow(_process.MainWindowHandle, 3u);
            resize();
        }
     
        private void _container_Resize(object sender, EventArgs e)
        {
            resize();
        }
     
        private void resize()
        {
            if (_process != null)
            {
                // Pour forcer notre process à occuper tout l'espace de notre formulaire
                ShowWindow(_process.MainWindowHandle, 1u);
                ShowWindow(_process.MainWindowHandle, 3u);
            }
        }
     
    }
    En gros, voici le principe :
    1. Lorsque le processus est créé, on créé une Form "conteneur" qui sera rattachée à notre form principal
    2. On fait en sorte que la fenêtre principale du processus soit rattachée à la Form "conteneur"


    Enjoy.

    Il y a surement quelques aspects à peaufiner en plus (par exemple, la double barre de titre au niveau de la Form conteneur, ou la gestion de la durée de vie de la form en fonction de celle du processus qui y est rattaché), mais le principe est là. Et en plus, le code reste simple
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Brésil

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    Merci, ça fonctionne très bien.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Brésil

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    Bonjour, je reviens à cette discussion, j'ai essayé de mettre plusieurs exe par exemple Word, PowerPoint, Excel , Notepad, la calculatrice etc. Tout fonctionne sauf la calculatrice qui disparait du premier plan à chaque fois malgré que c'est le même principe du notepad.
    Une idée de ce problème ?
    Merci.

  6. #6
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Sheva07 Voir le message
    Une idée de ce problème ?
    Quelle solution as-tu utilisé pour la mise au premier plan? Les API Windows ou l'encrage dans une Form en TopMost?

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Brésil

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    Les API comme ce qu'a proposé dorinf au debut

  8. #8
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Sheva07 Voir le message
    Bonjour, je reviens à cette discussion, j'ai essayé de mettre plusieurs exe par exemple Word, PowerPoint, Excel , Notepad, la calculatrice etc. Tout fonctionne sauf la calculatrice qui disparait du premier plan à chaque fois malgré que c'est le même principe du notepad.
    Une idée de ce problème ?
    Merci.
    Je viens de faire un test, et voici ce qui se passe chez moi (sous Windows 10) : calc n'est pas une application win32, c'est une application du windows store. Et donc la procédure décrite plus haut ne fonctionne pas. Et là, je n'ai pas de piste...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Brésil

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    Ah ça sera compliqué alors.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Brésil

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    Je viens d'avoir une idée, est-ce possible de mettre la calculatrice dans un WinForm ? j'ai essayé avec le notepad ça fonctionne mais la calculatrice non.
    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)]
        static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
    Process proc = Process.Start(
        new ProcessStartInfo()
        {
                                                                                                                  //Ici j'ai mis notepad.exe et ça marche
            FileName = Environment.GetEnvironmentVariable("windir") + @"\system32\calc.exe", 
            WindowStyle = ProcessWindowStyle.Minimized
        });
                Thread.Sleep(200);
                SetParent(proc.MainWindowHandle, this.panel1.Handle);

  11. #11
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Alors, ton idée comme tu dis c'est justement ce qui ne marche pas ! Car le code je te t'ai transmis il y a quelque jours repose exactement sur ce principe :
    1. Mettre ton application externe dans une webform ;
    2. Afficher cette webform au dessus d'une autre.


    Le problème c'est que tu dois être comme moi, avec une version de Windows 10, où la calculatrice n'est plus une application Win32 classique mais une application WindowsStore. Et là, malheureusement, ça ne fonctionne pas.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  12. #12
    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
    Points : 5 195
    Points
    5 195
    Par défaut
    peut-etre une piste avec ce lien :

    http://stackoverflow.com/questions/3...-in-background
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/12/2015, 17h56
  2. Réponses: 2
    Dernier message: 13/11/2012, 23h36
  3. Mettre fenêtre d'un exe au premier plan
    Par arn0caba2le dans le forum C++
    Réponses: 1
    Dernier message: 24/11/2007, 12h01
  4. Mettre des fenêtres en premier plan
    Par eliek_9 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 02/08/2006, 06h08
  5. Réponses: 2
    Dernier message: 07/02/2005, 16h43

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