Passage de paramètre

clementio Messages postés 432 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 février 2014 - 4 mars 2006 à 22:09
clementio Messages postés 432 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 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.

Merci d'avance

Clementio

10 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
4 mars 2006 à 23:19
salut,

ce n'est pas un domaine trop exploré pour ma part, mais tu devrais avoir pas mal de résultats avec le mot-clef DDE

@+

PCPT [AFCK]
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
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". )
0
clementio Messages postés 432 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 février 2014 1
5 mars 2006 à 18:05
Je vois ce que tu veux dire, c'est app.previnstance si c'est true alors l'appli est déjà lancée. Mais ça ne m'aide pas...


J'ai regardé la méthode DDE mais c'est pas mal confus, je vais donc me tourner vers winsock en espérant que je vais y arriver...

Merci en tout cas pour vos réponses!!!

Clm
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
5 mars 2006 à 18:24
Arf, suis arrivé trop tard, tu as déjà testé et ça ne fonctionne pas ?
0
clementio Messages postés 432 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 février 2014 1
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?
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
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

End If

'... la suite de ton code

End Sub

J'espère que ça pourra t'aider.

Bonne prog
0
clementio Messages postés 432 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 février 2014 1
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???
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
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.
0
clementio Messages postés 432 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 février 2014 1
7 mars 2006 à 15:37
Problème résolu!!!

Merci pour vos réponses et j'ai déposé une source là-dessus si ça vous intéresse:

http://www.vbfrance.com/codes/GLOBALGETATOMNAME-POUR-PASSER-MESSAGES-ENTRE-DEUX-APPLICATIONS_36426.aspx
0
Rejoignez-nous