2011-04-01 2 views
3

J'ai une application C# WinForm que j'ai créée pour stocker les fichiers dans un emplacement sécurisé séparé sur le disque dur. J'essaye d'ajouter des fonctionnalités au programme en ajoutant un menu contextuel de clic droit de sorte que lorsqu'un utilisateur clique avec le bouton droit sur un fichier (ou un groupe de fichiers) dans Windows, mon programme est là dans le contexte pour les sélectionner. Pas de problème là-bas, j'ai fait ce travail. Ce dont j'ai besoin est d'obtenir par programmation cette liste de fichiers et de l'envoyer au programme afin qu'ils soient déjà listés dans la liste.C# winform s'ouvre avec le menu contextuel du clic droit, mais comment afficher l'élément sélectionné?

Je fais déjà quelque chose de similaire avec un multiselect dans un OFD, mais je ne veux pas qu'ils aient à ouvrir le programme, sélectionner browse, trouver les fichiers et les sélectionner quand ils sont déjà sélectionnés dans windows.

Il ya une tonne de programmes qui ont cette fonctionnalité (comme les propriétés plus, le bloc-notes, etc ...) J'ai juste besoin d'un coup de pouce dans la bonne direction pour m'aider à comprendre cela.

Merci à l'avance,

Dave

+0

Vous parlez probablement d'un "gestionnaire d'extension shell". Il n'y a aucun support pour ça dans .NET. Vous trouverez des choses en parcourant la chaîne citée. –

Répondre

2

Si je comprends bien ce que vous avez déjà mis en place, tous les fichiers doivent apparaître comme arguments sur la ligne de commande du programme. Vous avez juste besoin d'un moyen d'extraire chacun de ces chemins de fichier et de les afficher dans votre vue de liste.

En C#, le code suivant affiche une boîte de message contenant chaque argument sur la ligne de commande:

static void Main(string[] args) 
{ 
    foreach(string arg in args) 
    { 
     MessageBox.Show(arg); 
    } 
} 

Mais au cas où vous ne voulez pas y accéder dans la méthode Main, vous pouvez également utiliser la classe Environment, qui fournit le GetCommandLineArgs method statique. Il renvoie le même tableau de chaînes contenant les arguments, et vous pouvez le parcourir de la même manière.

+0

vous êtes génial merci ... mais ... maintenant j'ajoute chaque argument à un ArrayList et envoie cette liste à une classe. Il ouvre maintenant une instance de mon programme pour chaque argument, au lieu de l'ouvrir une seule fois pour tous les arguments. Qu'ai-je fait pour y arriver? –

+0

Voir ma réponse J'ai posté ci-dessous. –

0

je ramasse tous les arguments et les envoyer à une ArrayList.

static void Main(string[] args) 
    { 
     ArrayList myAL = new ArrayList(); 

     foreach (string arg in args) 
     { 
      myAL.Add(arg); 
     } 

     ALRec nalr = new ALRec(); 
     nalr.getArrList(myAL); 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

envoyer à ALREC Classe

class ALRec 
{ 
    ArrayList MyArrLst = new ArrayList(); 

    public void getArrList(ArrayList AL) 
    { 
     MyArrLst = AL; 
    } 
} 

Pourquoi est-il démarrage de plusieurs instances de mon application?

+0

Vous avez confondu la coloration syntaxique (et moi) avec vos conventions de majuscules. Généralement, les variables locales et de classe sont camelCased, tandis que les noms de fonctions sont PascalCased. Quoi qu'il en soit, ce code ne démarre certainement pas plusieurs instances de votre application. La commande 'Application.Run' n'est appelée que * une fois *, ce qui signifie qu'une seule instance est démarrée. Le problème est évidemment dans la façon dont vous avez enregistré le gestionnaire de menu contextuel dans le shell. Comme Hans le dit, c'est probablement la partie la plus difficile.Je suppose que Windows crée une nouvelle instance de votre application pour * chaque * –

+0

... les fichiers que vous avez sélectionnés, plutôt que de les envoyer * tous * à la même instance sur la ligne de commande. Pouvez-vous nous montrer le code que vous avez utilisé pour ajouter votre application au Registre en tant que gestionnaire de fichiers? –

+0

Le seul travail de registre que j'ai fait est d'ajouter la commande shell. hklm \ software \ classes \ * \ shell \ "Nom du menu contextuel" \ command. la valeur de chaîne définie dans la commande est - app.exe "% 1" depuis que j'ai mis le fichier app.exe dans le dossier system32 je n'ai pas eu à spécifier de chemin. –

Questions connexes