clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 2014
-
4 mars 2006 à 22:09
clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 2014
-
7 mars 2006 à 15:37
Salut,
Je voudrais savoir si il est possible de passer un paramètre à une application VB déjà ouverte.
En fait j'ai une application qu'on lance à partir d'un clic droit sur un fichier dans l'explorateur Windows. L'application s'ouvre est récupère le chemin du fichier dans une ListBox. Mais lorsque que je sélectionne plusieurs fichiers, l'application s'ouvre autant de fois qu'il y a de fichiers.
Ensuite, L'asuce était de placer mon application dans le menu "envoyer vers". Lors de la sélection de plusieurs fichiers, je ne lance bien qu'une fois mon application mais je suis limité par une sélection de 22 fichiers sinon Windows m'affiche un message d'erreur.
Sinon (et c'est ce que je fait en ce moment), j'utilise un DragAndDrop avec autant de fichiers que je veux que je dépose sur ma ListBox et ça marche bien.
Mais je ne suis pas satisfait, je veux pouvoir sélectionner autant de fichiers que je veux, faire mon clic droit et lancer mon appli. Une fois une première insrance de l'application ouverte, je voudrais que les autres instances la détecte et envoient en paramètre le nom du fichier à la première instance qui est déjà ouverte.
Pffff, j'espère avoir été clair et surtout que quelqu'un pourra m'aider.
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 5 mars 2006 à 17:05
En fait, y'a un truc que t'a pas encore vu visiblement... Tu as la possibilité de limiter l'exécution de ton prog à une seule instance. Autrement dit, tu peux le lancer 20 fois qu'il n'y aura qu'une seule fenêtre (je sais pas si je suis très clair là!!!). Bref, ceci devrait te permettre de faire ce que tu veux même si je t'avouerais que moi non plus je n'ai pas approfondi le sujet n'ayant jamais testé cette technique.
Je ne sais plus exactement comment on fait pour limiter ton prog à une seule instance mais c'est soit dans les propriétés de ton projet, soit une propriété ou méthode de ta feuille principale. Mais quoi qu'il en soit, regarde dans la MSDN (l'aide).
Enjoy
<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 5 mars 2006 à 18:23
Salut,
Si je comprend bien, tu utilises la fonction Command ?
Je ne sais pas non plus passer une multi-sélection en une seule fois au prog mais pour tester si ton appli est déjà en exécution ou non (à placer au début du Main() ou du Form_Load() de démarrage) :
If App.PrevInstance = True Then
'...
End
Else
'...
End If
Vous n’avez pas trouvé la réponse que vous recherchez ?
clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 20141 5 mars 2006 à 18:35
Je recommence car à chaque fois je perd mon message!!!!
Si ça marche mais en fait je bloque sur le code à mettre si c'est true. Comment faire passer le contenu de Command à la première instance de l'application qui elle est déjà lancée?
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 5 mars 2006 à 20:21
Faute de mieux, j'ai testé une méthode un peu "bourrin" mais qui fonctionne (en tous cas sous VB6) :
Mon test s'est porté sur un prog contenant une simple form mais tu peux adapter si tu passes par une sub main() en collant les api et la constante dans le module contenant la main().
L'idée est de fermer la précédente instance du prog pour pouvoir traiter la nouvelle commandline.
'déclaration des API
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'constante utilisée
Private Const WM_CLOSE = &H10
Private Sub Form_Load()
Dim hwnd As String
If App.PrevInstance = True Then
'lecture du handle du prog déjà lancé
Open App.Path & "\handle.dat" For Input As #1
Line Input #1, hwnd
Close #1
'fermeture de la précédente instance
Call PostMessage(CLng(hwnd), WM_CLOSE, 0, 0)
'sauvegarde du nouvel handle du prog
Open App.Path & "\handle.dat" For Output As #1
Print #1, FindWindow(vbNullString, App.EXEName)
Close #1
Else
'sauvegarde du handle du prog
Open App.Path & "\handle.dat" For Output As #1
Print #1, FindWindow(vbNullString, App.EXEName)
Close #1
clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 20141 5 mars 2006 à 20:33
Merci pour cet exemple mais on peut écrire "Me.Hwnd" à la place de "FindWindow(vbNullString, App.EXEName)" et je ne vois pas comment tu passes le "Command" à l'autre instance???
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 5 mars 2006 à 20:45
Pour me.hwnd, ok si tu n'as qu'une form dans ton appli.
Pour le command, j'ai cru comprendre que tu savais le récupérer donc, où est le problème ? Tu places ton code lisant les paramètres de la commandline à la place de '... la suite de ton code et ça devrait le faire.