Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ShellExecute avec plusieurs fichier

4 réponses
Avatar
user
Bonjour,

Je développe actuellement une application en C# qui intègre un
explorateur de fichier.

Cet explorateur doit avoir le même clic droit que celui de l'explorateur
windows, avec un popup qui affiche la liste des actions possibles selon
le type de fichiers sélectionnés. Et il est donc possible d'executer
diverses actions comme dans l'explorateur windows (par exemple,
"Ouvrir", "Editer", "Imprimer", ...).

J'ai un problème lorsque j'essaie de faire fonctionner ces actions sur
une liste de plusieurs fichiers sélectionnés. Je me suis basé sur des
fichiers mp3 pour mon exemple, avec l'action "Play In Winamp".

J'ai essayé plusieurs méthodes pour exécuter cette action (en récupérant
les infos à partir de la base de registre). La méthode qui me semble la
plus propre pour ce que je veux faire est d'utiliser ShellExecute (une
fonction importée de Shell32.dll).

Mais cette fonction prend en paramètre un unique fichier, et je ne sais
pas comment l'utiliser lorsque je veux faire "Play in Winamp" avec une
liste de plusieurs fichiers. Si je fais des appels successifs à
ShellExecute, winamp s'ouvre et me mets chaque fichier l'un après
l'autre tout seul dans la playlist, pour finir par jouer seulement le
dernier.
Je pense que cela vient du fait que ShellExecute attend que
l'application retourne un message (du genre "j'ai fini de me lancer")
avant de rendre la main à mon programme.

Ma question est donc, comment utiliser ShellExecute ou une fonction
similaire avec une liste de fichier ?

J'ai testé d'autres méthodes sinon, comme par exemple executer moi même
la commande "C:\...\Winamp.exe %1" recupérée depuis la base de registre.
Avec des appels à Process.Start pour chaque fichier, ma playlist se
construit dans le désordre (car mon programme n'attend aucun retour des
instances de winamp et donc la playlist est construite au bon vouloir de
l'ordonnanceur). Et remplacer %1 par la liste des fichier (pour faire un
seul appel à winamp.exe) n'est pas une bonne méthode car elle se heurte
à la limite de caractères des arguments d'un exécutable.

Merci.

4 réponses

Avatar
Christian ASTOR
wrote:

Je développe actuellement une application en C# qui intègre un
explorateur de fichier.

Cet explorateur doit avoir le même clic droit que celui de l'explorateur
windows, avec un popup qui affiche la liste des actions possibles selon
le type de fichiers sélectionnés. Et il est donc possible d'executer
diverses actions comme dans l'explorateur windows (par exemple,
"Ouvrir", "Editer", "Imprimer", ...).



Le menu est appelé automatiquement par l'interface IContextMenu
Et pour un exemple d'Explorateur de fichiers, voir principalement
l'exemple EnumDesk (en C++) dans la Platform SDK (IShellFolder, ...)
Avatar
Benlitz
Christian ASTOR a écrit :
wrote:

Je développe actuellement une application en C# qui intègre un
explorateur de fichier.

Cet explorateur doit avoir le même clic droit que celui de
l'explorateur windows, avec un popup qui affiche la liste des actions
possibles selon le type de fichiers sélectionnés. Et il est donc
possible d'executer diverses actions comme dans l'explorateur windows
(par exemple, "Ouvrir", "Editer", "Imprimer", ...).



Le menu est appelé automatiquement par l'interface IContextMenu
Et pour un exemple d'Explorateur de fichiers, voir principalement
l'exemple EnumDesk (en C++) dans la Platform SDK (IShellFolder, ...)



Bonjour,

Merci pour la réponse. Cependant, je ne souhaite pas utiliser le même
menu popup que celui de l'explorer, mais construire mon propre menu (car
le souhaite l'agencer différemment, ajouter des options,etc.).
Mon problème ne concerne donc pas le popup en lui même mais bien
l'execution d'une commande de celui-ci.
J'ai jeté un oeil à IContextMenu, je ne suis pas sur que cette interface
permette simplement d'executer une commande sans passer par le menu
popup de l'explorer.
Avatar
Sylvain SF
Benlitz a écrit :

Cet explorateur doit avoir le même clic droit que celui de
l'explorateur windows [...]





je ne souhaite pas utiliser le même menu popup que celui de
l'explorer [...]



j'avais un doute à la première lecture.
c'est donc bien le "même clic droit" qui est recherché!
si votre code ne transforme pas la souris en toaster
ni ne change ses boutons, vous devriez bien avoir le
"même clic droit", sous réserve que l'utilisateur ne
change pas son clic droit, naturellement.

HTH.
Sylvain.
Avatar
Christian ASTOR
Benlitz wrote:

Merci pour la réponse. Cependant, je ne souhaite pas utiliser le même
menu popup que celui de l'explorer, mais construire mon propre menu (car
le souhaite l'agencer différemment, ajouter des options,etc.).
Mon problème ne concerne donc pas le popup en lui même mais bien
l'execution d'une commande de celui-ci.
J'ai jeté un oeil à IContextMenu, je ne suis pas sur que cette interface
permette simplement d'executer une commande sans passer par le menu
popup de l'explorer.



Avec ::InvokeCommand(), en passant un tableau de pidls.
Un test avec 2 mp3 montre que ça fait la même chose que le menu
contextuel de l'Explorer ("Play in Winamp" ou "Open") (command id de
"open" pour lpVerb)