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
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.