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

Shell context menu

2 réponses
Avatar
Sandrine
Bonjour,

Quelqu'un aurait-il travaillé sur l'excellent code source concernant
l'affichage du menu contextuel de Windows (click droit dans
l'explorateur) dans un contrôle File ou Dir

http://www.mvps.org/btmtz/shellmenu

J'essaye d'adapter le code à un contrôle Listview contenant une liste
de fichiers.

Mais j'ai un problème: si la sélection se fait sur plusieurs fichiers,
c'est le chemin du premier (exemple c:\toto\ ) qui sert de references
pour le reste de la liste, si bien que si dans la liste il y a aussi
c:\titi\fichier2.txt la commande choisi dans le menu renvoi l'erreur
Fichier non trouvé.

C'est assez complexe comme problème et j'ai beau triturer le code dans
tous les sens je ne trouve pas la solution, peut être que quelqu'un
peut m'aider ?

Ou bien si vous avez des sources à ce sujet, je n'ai pas trouvé grand
chose :(

Merci.

2 réponses

Avatar
Gloops
Bonjour Sandrine,

J'en suis au stade du premier coup d'oeil, là-dessus, mais as-tu laissé
telle quelle la fonction GetFileLBItemPath ?

Si je ne m'abuse la liste de fichiers ne contient que le nom du fichier,
le chemin est déterminé d'après la liste de répertoires.

Si tu veux une liste avec des fichiers de plusieurs répertoires, il faut
qu'une de ses colonnes contienne le chemin. D'autres modèles de liste
permettent ça. Ou encore des tableaux. Ou peut-être tout simplement
afficher le chemin complet.
_______________________________________
Sandrine a écrit, le 01/11/2004 10:12 :

Bonjour,

Quelqu'un aurait-il travaillé sur l'excellent code source concernant
l'affichage du menu contextuel de Windows (click droit dans
l'explorateur) dans un contrôle File ou Dir

http://www.mvps.org/btmtz/shellmenu

J'essaye d'adapter le code à un contrôle Listview contenant une liste de
fichiers.

Mais j'ai un problème: si la sélection se fait sur plusieurs fichiers,
c'est le chemin du premier (exemple c:toto ) qui sert de references
pour le reste de la liste, si bien que si dans la liste il y a aussi
c:titifichier2.txt la commande choisi dans le menu renvoi l'erreur
Fichier non trouvé.

C'est assez complexe comme problème et j'ai beau triturer le code dans
tous les sens je ne trouve pas la solution, peut être que quelqu'un peut
m'aider ?

Ou bien si vous avez des sources à ce sujet, je n'ai pas trouvé grand
chose :(

Merci.




Avatar
Sandrine
Il se trouve que Gloops a formulé :
Bonjour Sandrine,

J'en suis au stade du premier coup d'oeil, là-dessus, mais as-tu laissé telle
quelle la fonction GetFileLBItemPath ?



Bein GetFileLBItemPath ajoute le chemin (spath) au nom du fichier
[objFLB.List(iItem)]
Perso, dans ma listview, il y a plusieurs colonnes, mais j'ajoute le
contenu de deux colonnes, soit chemin dans une colonne ajouté au nom du
fichier qui est dans une deuxième, du coup dans SPATH j'ai le chemin
complet ainsi que le nom du fichier, GetFileLBItemPath devient alors
inutile.


Si je ne m'abuse la liste de fichiers ne contient que le nom du fichier, le
chemin est déterminé d'après la liste de répertoires.




En fait, dans le programme "shellmenu" c'est le premier élément [(0)]
de la liste qui donne le chemin, ensuite les autres éléments (les
fichiers) sont transformé en PID (?).

Et je pense que cela se passe dans le module mShellDefs.bas, notamment
ici, enfin peut être.

-*----------------------------<

Public Function GetParentIShellFolder(ByVal pidlFQ As Long) As
IShellFolder
Dim nCount As Integer
Dim i As Integer
Dim isf As IShellFolder
Dim pidlRel As Long
Dim IID_IShellFolder As Guid
'On Error GoTo Out

nCount = GetItemIDCount(pidlFQ)
' If pidlFQ is 0 and is not the desktop's pidl...
If (nCount = 0) And (IsDesktopPIDL(pidlFQ) = False) Then Error 1

' Get the desktop's IShellfolder first.
If SHGetDesktopFolder(isf) = NOERROR Then

' Fill the IShellFolder interface ID,
{000214E6-000-000-C000-000000046}
With IID_IShellFolder
.Data1 = &H214E6
.Data4(0) = &HC0
.Data4(7) = &H46
End With

' Walk through the pidl and bind all the way to it's *2nd to last*
item ID.
For i = 1 To nCount - 1

' Get the next item ID in the pidl (child of the current
IShellFolder)
pidlRel = GetItemID(pidlFQ, i)

' Bind to the item current ID's folder and get it's IShellFolder
'If isf.BindToObject(pidlRel, 0, IID_IShellFolder, isf) <>
NOERROR Then Error 1

' Free the current item ID and zero it
MemAllocator.Free ByVal pidlRel
pidlRel = 0

Next

End If ' SHGetDesktopFolder(isf) = NOERROR

Out:
Beep
If pidlRel Then MemAllocator.Free ByVal pidlRel

' Return a reference to the IShellFolder
Set GetParentIShellFolder = isf


End Function


<--------------------------

A+