Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DÉTECTION D'UNE INSTANCE - RESTAURATION DE L'ANCIENNE INSTANCE


Information sur la source

Catégorie :API Classé sous : previnstance Niveau : Initié Date de création : 18/05/2001 Vu : 3 883

Note :
9,6 / 10 - par 5 personnes
9,60 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

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

  • '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
'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

 

Commentaires et avis

signaler à un administrateur
Commentaire de KevinK le 13/05/2002 15:46:09

J'ai trouvé un système plus simple pour activer l'ancienne instance.
il suffit qu'à chaque démarrage, on sauvegarde le handle de la fenêtre dans la base de registre (on peut bien sûr le faire dans un fichier texte si on veut):
    If App.PrevInstance Then
      PrevHwnd = Val(GetSetting(Nom_du_prog, Nom_de_la_clef, "Handle"))
      OpenIcon PrevHwnd
      SetForegroundWindow PrevHwnd
      End
    End If
SaveSetting Nom_du_prog, Nom_de_la_clef, "Handle", Me.hwnd

On n'utilise que les API OpenIcon et SetforegroundWindow pour l'activer, au lieu de toutes celles que tu utilisait, et c'est générique: ça marche pour vb4,5 et 6.
    Kevin K.

signaler à un administrateur
Commentaire de NeoToto le 18/02/2004 14:20:18

Terrible, merci a vous !

signaler à un administrateur
Commentaire de NoFutur le 28/01/2005 17:17:47

Bravo pour la source et l'alternative de kevinK
10/10

Bonne prog !!!

signaler à un administrateur
Commentaire de Egalon le 03/05/2005 20:26:21

C'est simple à mettre en oeuvre, c'et bien commenté...
bref c'est parfait: 10/10

J'aimerais savoir s'il ya un moyen de completer ce code avec des parametres. En supposant par exemple que l'appli ait des arguments sur la ligne de commande, comment faire passer ces arguments à l'instance en cours???

signaler à un administrateur
Commentaire de seb78 le 01/06/2005 17:21:36

Bravo, ce code est simple et efficace, néanmoins, il manque le passage de la ligne de commande pour ceux qui en ont besoin, j'ai pour celà trouvé un bon lien qui donne un exemple parfait et adaptable à souhait, le voilà

http://www.vbaccelerator.com/codelib/ssubtmr/startup.htm

Pour gérer une seule instance ouverte, il utilise un sémaphore binaire et pour le passage des paramètres, il utilise l'envoi de messages windows.

signaler à un administrateur
Commentaire de Neo.balastik le 01/06/2005 17:35:27

En effet, www.vbaccelerator.com est un site de référence.  Je le connais quasi comme ma poche ;O)

signaler à un administrateur
Commentaire de SupSeb le 16/03/2006 20:00:31

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 ?

signaler à un administrateur
Commentaire de PaTaTe le 24/04/2006 00:53:54

une option "garder l'ancienne instance en lui donnant le focus" ou "detruire afin d'en relancer une" serait pas mal non ?

signaler à un administrateur
Commentaire de INFOLOGIS le 24/06/2008 16:06:01

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.

signaler à un administrateur
Commentaire de INFOLOGIS le 27/06/2008 14:36:39

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

App.PrevInstance : C'est bien beau, mais... [ par processus ] Comment faire pour activer la fenêtre de la précédente instance au premier plan ?D'avance merci pour vos réponses app.previnstance [ par flagyg ] bonjours à tous,J'aimerais savoir comment la fonction app.previnstance s'y prend pour savoir si c'est le même programme qui est déjà lancé.Par exemple app.PrevInstance [ par balou2 ] ok j ai une application qui ouvre les mp3quand je double click dans exploreret quan je clicx sur une deuxieme chanson je voudrais que mon premier app App.PrevInstance avec Access97 [ par BasicInstinct ] comment empecher l'ouverture multiple d'une base access97 ? (eventuellement 2000) BasicInstinct App.PrevInstance ??? [ par Seth77 ] Salut Pourquoi App.PrevInstance ne marche pas sous XP ? Et comment le faire fonctionner ? thxHerve App.PrevInstance vraiment sur ou pas? [ par lolpop ] Bonjour,en cherchant comment bloquer le lancement multiple d'une application j'ai trouvé "App.PrevInstance "Et je voudrai savoir si c'est la solution If App.PrevInstance = True Then [ par kelm_by ] salut tous le monde,comment est ce que je peux lancer une form d'une application deja active If App.PrevInstance = True ThenEndapplication deja active App.PrevInstance = True command [ par kelm_by ] salut tous le monde,est ce que il ya un moyen pour reactiver l'application deja en execution pour changer le nom du fichier command Private Sub Form_A


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,811 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.