Comment créer mes gestionnaires de contexte de shell personnalisés pour Windows?

StackOverflow https://stackoverflow.com/questions/117651

  •  02-07-2019
  •  | 
  •  

Question

Problème

Langue: C # 2.0 ou ultérieure

Je souhaite enregistrer des gestionnaires de contexte pour créer des menus lorsque l'utilisateur clique avec le bouton droit de la souris sur certains fichiers (dans mon cas, * .eic). Quelle est la procédure à suivre pour enregistrer, supprimer et nettoyer les événements (clics) de ces menus?

J’ai la moindre idée que cela a quelque chose à voir avec le registre Windows, mais compte tenu de la quantité de données disponibles dans .net, je ne serais pas surpris qu’il existe des méthodes pratiques pour le faire proprement et simplement.

Les extraits de code, les références à des sites Web et les commentaires sont tous bons. S'il vous plaît, jetez-les moi.

Mettre à jour

De toute évidence, il existe un léger problème lors de la création de menus contextuels dans les langues gérées, comme plusieurs utilisateurs l’ont commenté. Existe-t-il un autre moyen privilégié d'obtenir le même comportement ou devrais-je passer du temps à examiner ces solutions de contournement? Cela ne me dérange pas du tout de faire cela, je suis heureux que les gens se soient efforcés de rendre cela possible - mais je veux tout de même savoir s'il existe un "correct / propre". moyen d'y parvenir.

Était-ce utile?

La solution

Résistez à l’écriture de Shell Extensions dans les langues gérées - de nombreuses choses pourraient bien se passer si vous suivez cette voie.

Parcourez ce fil pour plus de détails. Il contient des liens vous permettant de le faire si vous le souhaitez, ainsi que des conseils avisés sur les raisons pour lesquelles cela peut être fait, mais ne le devriez pas.

http: //social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/1428326d-7950-42b4-ad94-8e962124043e/

Vous revenez au C / C ++ non géré en tant que votre seul véritable outil ici.

Autres conseils

Ce n'est pas une bonne idée en raison de problèmes de dépendance potentiels entre les différentes versions du .NET Framework. Votre extension de shell risque d’attendre une version, alors qu’une version différente a peut-être déjà été chargée par l’application en cours d’exécution.

Ce fil de discussion contient un bon résumé de la situation.

Tandis que d'autres ont déjà mentionné que l'écriture d'extensions de shell dans .NET pur est une mauvaise idée en raison de conflits de framework, notez néanmoins que:

  1. Il existe des pilotes tiers (voir Eldos ou LogicNP) qui font le côté non managé pour vous, ce qui vous permet d'écrire du code managé qui parle au pilote natif, évitant ainsi les conflits de version CLR liés au shell.

  2. Un article récent de MSDN mentionnait que Microsoft avait résolu ce problème pour CoreCLR, tel qu'utilisé par Silverlight. Ils ont accompli cela en permettant à plusieurs versions du CLR de s'exécuter dans le même processus, corrigeant ainsi le problème. L'auteur a en outre déclaré que ce correctif dans Silverlight serait intégré aux futures versions du CLR complet. (Cela signifie qu’à l'avenir, il sera tout à fait possible d'écrire des extensions de shell en code managé.)

Je les ai déjà faites en C #. Cela finit par être beaucoup plus dur qu'il ne le devrait. Une fois que vous avez obtenu le code standard, il est facile de lancer de nouveaux éléments. J'ai suivi ce lien:

Lien vers les informations

Comme le mentionnent les commentaires précédents, ce n'est pas la meilleure idée d'écrire des extensions de shell dans des langages gérés, mais je pensais partager un projet Open Source faisant exactement cela:)

ShellGlue est une extension de shell gérée qui est très utile. Le code source pourrait également vous être utile si vous souhaitez écrire une extension de shell en C / C ++.

Hormis les mises en garde mentionnées à propos de l'implémentation d'extensions de shell dans le code managé, vous devez en principe procéder comme suit:

Tout d’abord, créez un composant COM en C # qui implémente les interfaces IShellExtInit IContextMenu. Comment créer des composants COM en C # est décrit ici . La manière de mettre en œuvre les interfaces nécessaires est décrite dans cet article . Bien que la description concerne une implémentation C ++, vous pouvez appliquer ces connaissances à votre version C #.

Votre composant COM aura un GUID appelé ID de classe ou CLSID. Vous devez enregistrer cet ID avec votre type de fichier en tant qu'extension de shell de menu contextuel:

HKEY_CLASSES_ROOT\.eic\ShellEx\ContextMenuHandlers\MyShellExt
    (Default) -> {YOUR-COMPONENTS-CLSID}

Assurez-vous également que vous avez correctement enregistré votre composant, comme décrit dans le didacticiel C # COM. Vous devriez le trouver dans le registre sous

HKEY_CLASSES_ROOT\CLSID\{YOUR-COMPONENTS-CLSID}
    InprocServer32
        (Default) -> C:\WINDOWS\system32\mscoree.dll
        Class -> YourImplClass
        assembly -> YourAssembly, version=..., Culture=neutral, PublicKey=...
        ...

Bonne chance ...

Comme d'autres l'ont déjà fait remarquer, les extensions de shell ne sont pas pratiques dans le développement Windows.

J'ai récemment posé une question similaire à laquelle un lien vers un guide a été répondu. faire exactement ce que je voulais faire

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top