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

VB.NET Discussion :

Visual Basic 2010 : Restreindre l'ouverture d'une application si elle est déja ouverte [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut Visual Basic 2010 : Restreindre l'ouverture d'une application si elle est déja ouverte
    Bonjour,

    Savez-vous comment il faudrait faire pour restreindre l'ouverture d'une application si elle est déja ouverte, par exemple:

    -On ouvre l'application une fois, puis ensuite si on veut ouvrir une deuxieme fois l'application il faudrait qu'elle ouvre l'application qui est déja en cours (dans le systray par exemple elle se maximized) - pour éviter d'avoir 2 fois l'application ouverte en même temps (une seule c'est assez)

    Faut t'il passer par le registre ?


    Merci.

  2. #2
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 330
    Points : 774
    Points
    774
    Par défaut
    Bonjour,

    Il y a dans les propriétés du projet, dans l'onglet Application, une case à cocher nommée "Application à instance unique", il faut la cocher pour avoir l'effet que vous souhaitez.

  3. #3
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    Ok merci c'est niquel en cochant "Application à instance unique", dés qu'on veut ouvrir le programme c'est l'application en cours qui se re-ouvre, ce systeme il marche seulement avec Form1, c'est dommage la Form2 elle veut rien savoir quand Form1 est en Hide.


    exemple:

    1) on ouvre le programme la premiere fois = le programme est donc ouvert et on le minimize
    2) on veut re-ouvrir une 2eme fois le meme programme = le programme qui est déja ouvert s'affiche (maximized) mais il faut imperativement que c'est Form1 qui soit en cours d'éxecution et non form2 (avec form1 en hide)

    jusqu'a là c'est ok, mais a partir de là j'ai pas mon souhait:

    3) Dés que form1 est hide , il y a donc form2 qui s'allume et Form1 est en hide = ensuite form2 on le met en minimize - ensuite il faudrait que Form2 s'affiche dés qu'on essaye de re-ouvrir le programme.


    Dans une nouvelle application (Fichier Nouveau projet)
    - on coche ensuite "Application à instance unique"
    - dans form1 load on met rien
    - on lance l'application: l'application va donc s'ouvrir une premiere fois et ensuite on minimize l'application et on en relance une deuxieme : l'application va reouvrir l'application qui est déja en cours (donc ce truc là c'est ok)

    ensuite on crée un form2
    -dans form1 load on met: Me.Hide() et Form2.show()
    -on lance l'application : l'application s'ouvre, form1 ferme et form2 s'ouvre, ensuite on minimize form2 et quand on relance une 2eme application form2 de l'application déja en cours ne veut pas s'affiché , il faudrait faire comment?

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Dans ce cas il faut le gérer toi même. (en cherchant up peu sur internet on trouve tous les éléments)
    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
        Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nCmdShow As SHOW_WINDOW) As Boolean
     
        <Flags()> _
        Private Enum SHOW_WINDOW As Integer
            SW_HIDE = 0
            SW_SHOWNORMAL = 1
            SW_NORMAL = 1
            SW_SHOWMINIMIZED = 2
            SW_SHOWMAXIMIZED = 3
            SW_MAXIMIZE = 3
            SW_SHOWNOACTIVATE = 4
            SW_SHOW = 5
            SW_MINIMIZE = 6
            SW_SHOWMINNOACTIVE = 7
            SW_SHOWNA = 8
            SW_RESTORE = 9
            SW_SHOWDEFAULT = 10
            SW_FORCEMINIMIZE = 11
            SW_MAX = 11
        End Enum
     
        Private Sub MaximizeAll()
            For Each p As Process In Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)
                ShowWindow(p.MainWindowHandle, SHOW_WINDOW.SW_MAXIMIZE)
            Next p
        End Sub
     
        Function AppliActive() As Boolean
            Return (Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName).Length > 1)
        End Function
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
            If AppliActive() Then
                MaximizeAll()
                Me.Close()
            End If
            ' ...
    A+, Hervé.

  5. #5
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Ou voir du coté de cette source:

  6. #6
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    Bonjour,

    Je suis débutant en Visual Basic, j'ai commencé mon premier projet (celui ci) il y a 10 jours environ, j'pouvais le faire avant le projet mais je trouvais que c'etait trop dure, le truc qui me perturbe aussi c'est qu'il est trés difficile d'installer une application (vb.net) sur un Windows XP (même avec SP 3). je pensais que dans le Service Pack 3 d'XP d' il y avait des framework mais non rien du tout) - le mieux c'est de bricolé dans installshield pour rendre disponible l'installation seulement sur: Windows 7 / Windows 8 et Windows XP avec un framework au minimum.

    Dans l'application que j'essaye de faire depuis 10 jours environ , il y a:

    -Form1 (équivalent au login & password
    -Dés qu'on rentre le login et le mot de passe, il y a une connexion php avec un proxy=nothing et il est dans un BackgroundWorker pour pas que l'identification sur php ne fait freezer le programme
    -quand l'identification est ok (et que php retourne une vraie session) Form1 se met en hide et c'est Form2 qui s'ouvre - ou si le login& mot de pase n'est pas bon il y a juste un rendu de fausse déconnexion et c'est toujours le formulaire login&password du form1 qui se remet) - pendant le BackgroundWorker il y a une petite image qui tourne (pour faire style loading)
    //Form1 : 98% fini (il reste le choix de la mémorisation du mot de passe&login, optimisation design, un lien pour récuperer le passe perdu, crypter le mot de passe dans le fichier session.txt (ou session.ini pour faire style pro) car le mot de passe est en nature dans session.ini)

    -une fois le Form2 en show (et Form1 en hide) il y a un chargement d'un flash, le flash il fait vraiment tout, c'est une application flash d'environ 500 Ko en release - ce coté là il fonctionne bien , tout s'affiche bien mais il y a des petits détails que j'aime pas:

    *dés que Form1 est en minimize et qu'on coche "application instance unique" par défaut sa reouvre Form1 par défaut (en maximixed on va dire ou en normal) donc là c'est ok il fait son bon job - Form2 lui il ne fait rien , on dirait que quand on coche "application instance unique" il y a que Form1 qui se reouvre mais jamais le Form2 , comme Form1 est en Hide rien ne s'agrandi, le Form2 lui ne veut pas se mettre en maximixed ou en taille normal) , il reste dans la barre des taches sans s'agrandir.

    les autres détails sont de type:
    *axShockwaveFlash.Movie ne detecte pas si l'url est null ou si il y a une erreur de chargement ou si le chargement de l'url est complete
    si il existe aucun event pour Movie, flash peut envoyer un fscommand pour dire que le flash est ok et qu'il est bien en ligne - si flash n'envoi aucun fscommand au bout de 3-5-10 secondes c'est que Movie n'est pas bon

    //Form2 est 90% fini - si j'arrive a réglé les deux plus grands problemes de dessus le projet est au top

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par mecmec Voir le message
    *dés que Form1 est en minimize et qu'on coche "application instance unique" par défaut sa reouvre Form1 par défaut (en maximixed on va dire ou en normal) donc là c'est ok il fait son bon job - Form2 lui il ne fait rien , on dirait que quand on coche "application instance unique" il y a que Form1 qui se reouvre mais jamais le Form2 , comme Form1 est en Hide rien ne s'agrandi, le Form2 lui ne veut pas se mettre en maximixed ou en taille normal) , il reste dans la barre des taches sans s'agrandir.
    C'est pour cela que je te donne une autre solution dans le post 4

    Solution qui fonctionne et si la form2 est réduite dans la barre des tâche, elle est réouverte en Maximized grâce à la valeur SHOW_WINDOW.SW_MAXIMIZE dans la sub.

    Il faut donc copier ce code dans ta form1 (la déclaration de function ShowWindow, l'enum SHOW_WINDOW, la sub MaximizeAll ainsi que la function AppliActive, et copier le bout de code de form1_load (4 lignes) dans ton load (au début) de ta form1.

    A+, Hervé.

  8. #8
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    Ah oui merci en effet il a l'air de marché ce code , en fait le code depuis hier il marchait pas car il faut décocher "Application à instance unique" , c'est bien ça?

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    La solution proposée par Hervé devrait marcher, mais c'est un peu du bricolage, et il y en a une autre qui est probablement plus simple et plus propre... Il faut utiliser l'évènement StartupNextInstance de My.Application :

    - coche la case "Application à instance unique"
    - clique sur "Afficher les événements de l'application" pour ouvrir le fichier ApplicationEvents.vb
    - Ajoute le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            Private Sub MyApplication_StartupNextInstance(sender As Object, e As ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
                For Each f As Form In OpenForms
                    If f.Visible Then
                        If (f.WindowState = FormWindowState.Minimized) Then
                            f.WindowState = FormWindowState.Normal
                        End If
                        f.Activate()
                        e.BringToForeground = False
                        Exit Sub
                    End If
                Next
            End Sub
    Ce code prend la première Form visible qu'il trouve, et la met au premier plan.

  10. #10
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    le code il marche bien , j'ai mis longtemps pour tout réglé, mais ici il y a toujours des problèmes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
            If AppliActive() Then
     
                MaximizeAll()
     
                ' MsgBox("test")
                'Me.Close()
                Application.Exit()
                Exit Sub
            End If
    la 2eme application se lance et s'eteint aussitot, elle clignotte genre 0,010 seconde, elle affiche le design et aussitot la fenetre s'eteint (0,010s) et ensuite la form2 (ou la form1) de l'application déja ouverte s'ouvre parfaitement bien (avec le maximixed) - mais c'est dommage que la deuxieme application clignotte et se ferme aussitot, j'ai décoché "activer l'infrastructure de l'application" pour activer un Sub Main() mais aprés l'application ne veut pas s'ouvrir puisque elle est assez lourde et elle a été construite avec "activer l'infrastructure de l'application" d'activé - une deuxieme application qui s'ouvre vite fait et se ferme vite fait elle se voit trés fort quand il y a un systray car un 2eme systray arrive (de la 2eme application) puis aussitot elle se ferme (comme un clignottement) mais sinon c'est bien car la premiere application s'agrandi quand on veut lancé une 2eme fois l'application, c'est déja top ça !!

  11. #11
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    Ok merci TomLev, j'ai testé, mais par contre il y a encore un ptit problème :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     If f.Visible Then
                        If (f.WindowState = FormWindowState.Minimized) Then
                            f.WindowState = FormWindowState.Maximized
                        End If
    Comment il faudrait faire (avec un if) pour que le Form1 soit en FormWindowState.Normal OU Form2 en Maximized, une idée?

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Essaie la solution que j'ai proposée, ça devrait mieux marcher

  13. #13
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    Oui tomlev on n'a posté en même temps

  14. #14
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                    If f.Visible Then
                        If (f.WindowState = FormWindowState.Minimized) Then
                            If f.Name = "Form2" Then
                                f.WindowState = FormWindowState.Maximized
                            Else
                                f.WindowState = FormWindowState.Normal
                            End If
     
                        End If
    on dirait que sa marche super bien.

    Merci,

    Salutations.

  15. #15
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par tomlev Voir le message
    La solution proposée par Hervé devrait marcher, mais c'est un peu du bricolage, ...
    Désolé pour le bricolage.

    Citation Envoyé par tomlev Voir le message
    Il faut utiliser l'évènement StartupNextInstance de My.Application
    Merci pour l'info.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/04/2013, 08h26
  2. Réponses: 4
    Dernier message: 19/02/2013, 18h31
  3. Réponses: 3
    Dernier message: 29/09/2010, 10h28
  4. Réponses: 2
    Dernier message: 06/05/2010, 15h52
  5. Réponses: 2
    Dernier message: 10/05/2007, 22h19

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