Menu contextuel de fichier

[Résolu]
Signaler
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015
-
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015
-
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

Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
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]
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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