begin process at 2010 03 19 12:32:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :previnstance Niveau :Initié Date de création :18/05/2001 Vu :4 143

Auteur : Neo.balastik

Ecrire un message privé
Site perso
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


 Sources du même auteur

Source avec Zip Source avec une capture TASKBAR INFO
Source avec Zip Source avec une capture LISTE DES DRIVERS ODBC ET DSN ASSOCIES (MAJ)
Source avec Zip Source avec une capture ANIMER UNE FENÊTRE AVEC ANIMATEWINDOW (SANS L'EFFET NOIR DAN...
Source avec Zip Source avec une capture TAILLE D'UN RÉPERTOIRE - 2 MÉTHODES
Source avec Zip Source avec une capture LISTE DES DSN UTILISATEUR

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISATION DE L' API GOOGLE YOUTUBE RECHERCHER ET LIRE DES ... par tresorsdevie
Source avec Zip Source avec une capture Source .NET (Dotnet) FAIRE LA DIFFÉRENCE ENTRE UNE ADRESSE EMAIL QUI EXISTE D'UNE... par lesinfosdugeek
ENVOYER UN MESSAGE SUR SON COMPTE TWITTER par lesinfosdugeek
Source avec Zip Source avec une capture TROUVER LES CLÉS DE REGISTRE QUI CHANGENT par Flocreate
Source avec Zip IP_PUBLIQUE_INTERNETGETCONNECTEDSTATE par marco62118

 Sources en rapport avec celle ci

Source avec Zip DÉTECTER UNE INSTANCE PRÉCÉDENTE DE MON APPLICATION par jack
Source avec Zip INSTANCE UNIQUE DE VOTRE APPLICATION par Renfield

Commentaires et avis

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.

Commentaire de NeoToto le 18/02/2004 14:20:18

Terrible, merci a vous !

Commentaire de NoFutur le 28/01/2005 17:17:47

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

Bonne prog !!!

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

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.

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)

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 ?

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 ?

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.

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


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,763 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales