Détection d'une instance - restauration de l'ancienne instance

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 418 fois - Téléchargée 58 fois

Contenu du snippet

Il peut être embêtant qu'une application puisse être lancée plusieurs fois... Pour détecter une instance précédente, l'objet de VB 'APP' nous propose une méthode 'Previnstance' qui retourne TRUE si l'application a déjà été lancée.
Je vous propose ici une méthode plus 'professionnelle' qui complète cet objet. Si une instance à été trouvée, l'application ne s'ouvre pas à nouveau et c'est celle déjà ouverte qui reprend le focus... Le code fonctionne pour VB4, VB5 et VB6.

Source / Exemple :


'A COLLER DANS UN MODULE
'
'DECLARATION API
Declare Function OpenIcon Lib "user32" (ByVal hwnd As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

'DECLARATION CONSTANTE
Public Const GW_HWNDPREV = 3

Sub ActivatePrevInstance()
         
    Dim OldTitle As String
    Dim PrevHndl As Long
    Dim result As Long

         'Sauve le titre de l'applciation.
         OldTitle = App.Title

         'Renomme le titre de l'application, ainsi FindWindow
         'ne trouvera pas l'instance de cette application.
         App.Title = "unwanted instance"

         'Tentative d'obtention du handle de la fenêtre utilisant le nom de classe de VB4.
         PrevHndl = FindWindow("ThunderRTMain", OldTitle)

         'Vérification si le handle a été trouvé
         If PrevHndl = 0 Then
            'Tentative d'obtention du handle de la fenêtre utilisant le nom de classe de VB5.
            PrevHndl = FindWindow("ThunderRT5Main", OldTitle)
         End If

         'Vérification si le handle a été trouvé
         If PrevHndl = 0 Then
         'Tentative d'obtention du handle de la fenêtre utilisant le nom de classe de VB6.
         PrevHndl = FindWindow("ThunderRT6Main", OldTitle)
         End If

         'Vérification si le handle a été trouvé
         If PrevHndl = 0 Then
            'Aucune instance précédente trouvée.
            Exit Sub
         End If

         'Obtention du handle de la fenêtre précédente.
         PrevHndl = GetWindow(PrevHndl, GW_HWNDPREV)

         'Restaure le programme.
         result = OpenIcon(PrevHndl)

         'Active l'application.
         result = SetForegroundWindow(PrevHndl)

         'Termine l'application.
         End
 End Sub

Conclusion :


Pour utiliser cette procédure, je vous propose ceci:
If App.Previnstance Then ActivatePrevInstance

A voir également

Ajouter un commentaire

Commentaires

INFOLOGIS
Messages postés
2
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
27 juin 2008
-
j'ai trouvé ce que je cherchais sur le post de zavier666 que je remercie! (http://www.vbfrance.com/codes/HANDLE-API-MANIPULATION-FENETRE_35981.aspx)

ça m'a permis de faire des actions sur une instance d'une logiciel, comme réouvrir un logiciel réduit en icône... :)
INFOLOGIS
Messages postés
2
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
27 juin 2008
-
est-il possible de lancer une fonction ou autre sur la précédente instance que l'on ouvre?

Car mon appli peut être dans la barre de notification et j'aurai souhaité qu'elle s'ouvre au moment ou je relançais l'exe.
cs_PaTaTe
Messages postés
1878
Date d'inscription
mercredi 21 août 2002
Statut
Contributeur
Dernière intervention
7 janvier 2019
-
une option "garder l'ancienne instance en lui donnant le focus" ou "detruire afin d'en relancer une" serait pas mal non ?
SupSeb
Messages postés
9
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2007
-
Je ne sais pas si j'ai bien fait ce qu'il fallait mais pour moi cela marche trés bien si on lance 2 fois le meme executable mais si on place le meme executable a 2 endroits différents la pas de probleme on peut lancer les 2 executables

non ?
Neo.balastik
Messages postés
797
Date d'inscription
jeudi 17 mai 2001
Statut
Membre
Dernière intervention
5 mai 2009
4 -
En effet, www.vbaccelerator.com est un site de référence. Je le connais quasi comme ma poche ;O)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.