OUVRIR PLUSIEURS FICHIERS DANS UNE SEULE INSTANCE

MoiOlivier Messages postés 172 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 4 août 2005 - 30 juil. 2005 à 21:10
cs_Pim Messages postés 26 Date d'inscription samedi 24 août 2002 Statut Membre Dernière intervention 6 septembre 2006 - 31 juil. 2005 à 20:42
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32973-ouvrir-plusieurs-fichiers-dans-une-seule-instance

cs_Pim Messages postés 26 Date d'inscription samedi 24 août 2002 Statut Membre Dernière intervention 6 septembre 2006
31 juil. 2005 à 20:42
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
31 juil. 2005 à 17:15
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 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
31 juil. 2005 à 16:15
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
30 juil. 2005 à 23:14
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
30 juil. 2005 à 21:10
Merci, merci, merci, merci, etc.
10/10.