Menu contextuel de fichier [Résolu]

Messages postés
478
Date d'inscription
mercredi 7 août 2002
Dernière intervention
10 juin 2015
- 18 mai 2007 à 09:04 - Dernière réponse :
Messages postés
478
Date d'inscription
mercredi 7 août 2002
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
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Dernière intervention
10 juin 2015
- 19 mai 2007 à 17:26
3
Merci
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

Merci cs_Warny 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 87 internautes ce mois-ci

Commenter la réponse de cs_Warny
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 18 mai 2007 à 09:55
0
Merci
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]
Commenter la réponse de sebmafate
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Dernière intervention
10 juin 2015
- 18 mai 2007 à 10:00
0
Merci
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
Commenter la réponse de cs_Warny

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.