Ouvrir plusieurs fichiers dans une seule instance

Soyez le premier à donner votre avis sur cette source.

Vue 13 270 fois - Téléchargée 996 fois

Description

Voici un bout de code qui permet d'ouvrir des fichiers dans une seule instance de votre appli. je l'explique : Quand vous ouvrez un fichier txt, ca ouvre le bloc note, si vous ouvrez un autre txt, ca ouvre une autre instance du bloc note.

En revanche, quand vous ouvrez une image sous xp, elle s'affiche dans le visualisateur, si vous ouvrez une autre image sans fermer le visualisateur, cette nouvelle image sera chargé, dans le visualisateur deja ouvers, il n'y aura pas 2 instances de l'appli.

C'est donc ce systeme que réalise cette source. Elle n'est pas de moi, mais ca fait tellement longtemp que je l'ai prise pour un prog, que je me rappelle plus ou je l'ai trouvée.
Je la met quand meme parce que on me l'a demandé sur le forum, et que je crois pas qu'il y en ai deja sur le site.

Pas de boucle qui tourne en permanence (c'est le principal atout de cette source), elle fonctionne avec un callback mais est tres stable ! meme dans l'IDE.
(Je crois pas que VB se soit crashé a cause de cette source)

L'appli livrée est un exemple qui illustre la source. J'y ai mis un label qui explique comment voir l'effet produit.
Il y a juste au chargement l'écriture d'une clé dans la base de registre.

Voila, en esperant que ca serve.
++

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Pim
Messages postés
26
Date d'inscription
samedi 24 août 2002
Statut
Membre
Dernière intervention
6 septembre 2006
-
Pour "Shell" et "AppActivate", l'application n'est PAS ouverte plusieurs fois, même si c'est une application personnelle.
En fait, ça fonctionne pour n'importe quelle application, même de "vieilles" applications qui veulent encore bien tourner sous Xp.

Pour l'API "shellexecute", je ne sais pas, je n'ai pas fait le test.

A+.
MoiOlivier
Messages postés
172
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
4 août 2005
-
Salut,
>CanisLupus, si c'est un prog que tu as fait toi-même, et que tu utilises "shell" ou "shellexecute", classiquement, windows va ouvrir le fichier dans une deuxième instance de ton prog, et c'est justement ça qu'on veut éviter, une deuxième instance.
Ici, avec ce code, il va ouvrir le fichier dans l'instance déjà ouverte.
cs_CanisLupus
Messages postés
3758
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
10 -
Pourquoi ne pas laisser faire ça à windows avec l'api ShellExecute ?

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Sub Command1_Click()

ShellExecute 0&, vbNullString, "C:\Mes documents\Mes images\image.jpg", vbNullString, "C:\Mes documents\Mes images", 1

End Sub
cs_Pim
Messages postés
26
Date d'inscription
samedi 24 août 2002
Statut
Membre
Dernière intervention
6 septembre 2006
-
Voici une méthode assez simple pour voir si une application a déjà été lancée et donc ne pas la lancer une deuxième fois.
Il s'agit simplement de mémoriser dans une variable l'identificateur (ID) de la tâche exécutée (Shell). Cette variable sera nulle si la tâche n'a pas encore été lancée. Dans le cas contraire, elle contiendra une valeur. Il suffit alors d'activer cette tâche (AppActivate). Une petite gestion de l'erreur si entretemps la tâche a été fermée par l'utilisateur.

L'exemple suivant demande juste un CommandButton appelé "Command1" pour fonctionner.

Il existe aussi une API qui fait ça, je ne me souviens plus de son nom.

Je ne sais pas si cela peut te servir, mais je te livre mon idée.
A+
-------------------------------------------------------------------

'Variable contenant le n° de la fenêtre ouverte d'une application donnée
Public IDFrame As Variant

Private Sub Command1_Click()

'Shell(pathname[,windowstyle]) : Lance un programme exécutable et renvoie une
'valeur de type Variant (Double) représentant l'identificateur (ID) de la
'tâche exécutée en cas de succès, ou un zéro en cas d'échec.

' Si aucun n° de fenêtre ouverte, en ouvrir un instance.

On Error GoTo erreur

If IDFrame = 0 Then
'Lance l'application
IDFrame = Shell("C:\WINDOWS\notepad.exe", vbNormalFocus)
'L'application a déjà été lancée => simplement lui donner le focus
Else
AppActivate IDFrame
End If

Exit Sub

erreur:
' Ex: logiciel a été fermé entretemps => son IDFrame existe toujours, mais
' plus la fenêtre elle-même => erreur pour passer l'activation sur celle-ci.
' Dans ce cas, il faut ouvrir une nouvelle instance de cette application !

IDFrame = Shell("C:\WINDOWS\notepad.exe", vbNormalFocus)

End Sub
MoiOlivier
Messages postés
172
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
4 août 2005
-
Merci, merci, merci, merci, etc.
10/10.

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.