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

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

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.