Procédure assez rigolote qui permet d'afficher dans un menu popup le contenu des dossiers d'un répertoire.
Elle est appelée de manière récurrente et à chaque appel le menu précédent est détruit.
Par contre le listage des dossiers est fait un c++ alors je vous laisse quand même un peu de travail pour remplacer l'appel...

PROCEDURE Gen_MenuPopupFolder(xLevel=0,xPath="",xPosX=0,xPosY=0)
// Affichage de l'arborescence locale sous forme de menu popup
// Procédure appelée de manière récurrente
// La procédure renvoi le path sélectionné

// Déclarations
cHandle est un entier
cCpt est un entier
cOcc est un entier
cChaine1 est une chaîne
cChaine2 est une chaîne
cPath est une chaîne
cOptionNum est un entier
cSelection est un entier
cOptionLib est une chaîne ASCIIZ sur 255
cuFlags est un entier
cNumOption est un entier

// Extrait la position de la souris
cPos, cPosX, cPosY sont des entiers
cPos = CurseurPos(cpEcran)
cPosX = PoidsFaible(cPos)
cPosY = PoidsFort(cPos)

// Remplissage du menu popup
// La première fois on utilise le résultat de NetListeDisque(-1)
SI xLevel=0 ALORS

// Positionnement au niveau du curseur
SI xPosX=0 ALORS xPosX=cPosX
SI xPosY=0 ALORS xPosY=cPosY

// Création du menu de base
cHandle=AppelDLL32("user32","CreatePopupMenu")
SI cHandle=0 ALORS
RENVOYER ""
FIN

// Ajout des lecteurs dans le menu
POUR cOcc=1 A ChaîneOccurrence(gpLecteurs,RC)
cChaine1=ExtraitChaîne(gpLecteurs,cOcc,RC)
SI ExtraitChaîne(cChaine1,2)~="HD" ALORS
cOptionLib=ExtraitChaîne(cChaine1,1)+":"+TAB+fDisqueInfo(ExtraitChaîne(cChaine1,1),fdNomVolume)
cCpt++
cOptionNum=gcOption+cCpt
AppelDLL32("user32","AppendMenuA",cHandle,MF_STRING,cOptionNum,&cOptionLib)
FIN
FIN

SINON

// Création du menu
cHandle=AppelDLL32("user32","CreatePopupMenu")
SI cHandle=0 ALORS
RENVOYER ""
FIN

// Ajout de l'option de sélection
cOptionLib=xPath
cOptionNum=gcOption+100
AppelDLL32("user32","AppendMenuA",cHandle,MF_STRING,cOptionNum,&cOptionLib)
cChaine1=gpX>>pListFolders(xPath)

// Ajout du séparateur
AppelDLL32("user32","AppendMenuA",cHandle,MF_SEPARATOR,0,0)

// Ajout de l'option permettant de redescendre d'un cran
cOptionLib=".."
cOptionNum=gcOption+100+1
AppelDLL32("user32","AppendMenuA",cHandle,MF_STRING,cOptionNum,&cOptionLib)

// Ajout de l'option permettant de revenir au niveau 0
cOptionLib="..."
cOptionNum=gcOption+100+2
AppelDLL32("user32","AppendMenuA",cHandle,MF_STRING,cOptionNum,&cOptionLib)

// Ajout des sous répertoires
SI PAS cChaine1~="" ALORS
cCpt=1
cChaine2=ExtraitChaîne(cChaine1,cCpt,RC)
TANTQUE cChaine2<>EOT
cOptionLib=cChaine2
cOptionNum=gcOption+100+(cCpt+2)
AppelDLL32("user32","AppendMenuA",cHandle,MF_STRING,cOptionNum,&cOptionLib)
cCpt++
cChaine2=ExtraitChaîne(cChaine1,cCpt,RC)
FIN
FIN

FIN

// Affichage du menu
cuFlags=TPM_VCENTERALIGN+TPM_LEFTALIGN+TPM_RETURNCMD
cNumOption=AppelDLL32("user32","TrackPopupMenu",cHandle,cuFlags,xPosX,xPosY,0,Handle(f_main),0)

// Si une option est choisie
SI cNumOption<>0 ALORS

// Option choisie
cSelection=cNumOption-gcOption-100

// Traitement de la sélection
// --> =0 : Choix d'une option
// --> =1 : Descend d'un niveau (..)
// --> =2 : Remonte au premier niveau (...)
// --> >2 : Monte d'un niveau
SELON cSelection

// Premier niveau
CAS 0:
cPath = xPath

// Descend d'un niveau
CAS 1:
SI xLevel>1 ALORS
xPath=Gauche(xPath,PositionOccurrence(xPath,"\",ChaîneOccurrence(xPath,"\")-1))
SINON
xPath=""
FIN
xLevel--

// Remonter au niveau 0
CAS 2:
xPath=""
xLevel=0

// Monter d'un niveau
AUTRE CAS:
AppelDLL32("user32","GetMenuStringA",cHandle,cNumOption,&cOptionLib,255,MF_BYCOMMAND)
SI xLevel=0 ALORS
xPath=Gauche(cOptionLib,2)+"\"
SINON
xPath=ComplèteRep(xPath+SansEspace(cOptionLib))
FIN
xLevel++

FIN

SI cSelection<>0 ALORS
AppelDLL32("user32","DestroyMenu",cHandle)
cPath = Gen_MenuPopupFolder(xLevel,xPath,xPosX,xPosY)
FIN

FIN

// Destruction des menus
RENVOYER cPath