cs_Pim
Messages postés26Date d'inscriptionsamedi 24 août 2002StatutMembreDerniè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és172Date d'inscriptionmardi 15 juillet 2003StatutMembreDerniè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és3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 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
cs_Pim
Messages postés26Date d'inscriptionsamedi 24 août 2002StatutMembreDerniè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 !
31 juil. 2005 à 20:42
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+.
31 juil. 2005 à 17:15
>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.
31 juil. 2005 à 16:15
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
30 juil. 2005 à 23:14
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
30 juil. 2005 à 21:10
10/10.