Menu contextuel de fichier

Résolu
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015 - 18 mai 2007 à 09:04
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015 - 19 mai 2007 à 17:26
Bonjour,

Pour la source http://www.csharpfr.com/codes/EXPLORATEUR-FICHIER-CONTROLE_42700.aspx j'ai besoin de charger le menu contextuel windows de mes fichiers. J'y arrive pour mes répertoires (encore que ça ne me convienne pas pleinement) mais pas pour mes fichiers.
J'utilise actuellement l'API shell32, mais il me manque de quoi lire les menus des fichiers. A part lire dans la registry, y a-t-il une autre solution ?

Voici le code que j'utilise actuellement :



if (menu == null) {
   menu = new ContextMenu();
   Verbs = new Dictionary<string, Shell32.FolderItemVerb>();



   try {
       Shell32.Shell objShell;
       Shell32.Folder2 objFolder2;



       objShell = new Shell32.ShellClass();
       objFolder2 = (Shell32.Folder2)objShell.NameSpace(path); // <-- ca plante ici si je spécifie un fichier, ça marche dans le cas d'un répertoire



       if (objFolder2 != null) {
           Shell32.FolderItem objFolderItem;
           objFolderItem = objFolder2.Self;
           /// etc. etc.


Merci d'avance,
Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres

3 réponses

cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
19 mai 2007 à 17:26
J'ai trouvé. En fait le problème se situe dans la chargement des objets du folder2, il faut remplacer ça :

Shell32.FolderItem objFolderItem;
objFolderItem = objFolder2.Self;

par ça :

if (
this.objectType ==
ObjectType.Directory ||
this.ObjectType==
ObjectType.Drive) {

    objFolder2 = (Shell32.Folder2)objShell.NameSpace(path);

    objFolderItem = objFolder2.Self;
} else {

    objFolder2 = (Shell32.Folder2)objShell.NameSpace(System.IO.
Path.GetDirectoryName(path));

    objFolderItem = objFolder2.ParseName(System.IO.Path.GetFileName(path));

}Bien sûr l'objet sous-jaccent revoie le type auquel je me rapporte.

Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
18 mai 2007 à 09:55
chercher l'erreur :
try {
       Shell32.Shell objShell;
       Shell32.Folder2 objFolder2;       objShell = new Shell32.ShellClass();
       obj Folder 2 = (Shell32.Folder2)objShell.NameSpace(path); // <-- ca plante ici si je spécifie un fichier, ça marche dans le cas d'un répertoire

       if (objFolder2 != null) {
           Shell32.FolderItem objFolderItem;
           objFolderItem = objFolder2.Self;
           /// etc. etc.

le mieux reste biensûr de parcourir la base de registre.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
18 mai 2007 à 10:00
Je sais bien que l'objet s'appelle folder2. Le problème, c'est qu'il est présenté pour fonctionner pour les fichiers d'un côté, et seulement pour les répertoires de l'autre. Le fait est qu'il ne fonctionne que pour les répertoires. Or il n'existe pas d'objet Shell32.File qqchose.
Le problème du parcours de la registry, c'est qu'il est possible de créer des menus dynamiques grâce à des dll que je ne sais pas appeler.

Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres
0
Rejoignez-nous