Wie kann ich meine benutzerdefinierte Shell Context Handlers für Windows erstellen?

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

  •  02-07-2019
  •  | 
  •  

Frage

Problem

Sprache: C # 2.0 oder höher


Ich möchte Kontext-Handler registrieren Menues zu erstellen, wenn der Benutzer vor, bestimmte Dateien klickt (in meinem Fall * .eic). Wie ist das Verfahren zu registrieren, deregistrieren (aufzuräumen) und Veranstaltungen (Klicks) aus diesen Menues umgehen?

Ich habe eine Ahnung, es ist etwas, mit dem Windows-Registry zu tun, aber wenn man bedenkt, wie viel Material dort in .net ist, würde ich nicht überrascht, wenn es praktisch Methoden sind diese sauber und einfach zu tun.

Code-Schnipsel, Website-Verweise, Kommentare sind alle gut. Bitte werfen sie mich an.

Update


Offensichtlich gibt es ein kleines Problem Kontext Menues in verwalteten Sprachen zu schaffen, da mehrere Benutzer kommentiert haben. Gibt es eine andere bevorzugte Art und Weise das gleiche Verhalten zu erreichen, oder sollte ich verbringen viel Zeit in diese Abhilfen suchen? Ich habe nichts dagegen überhaupt nicht zu tun, dass, ich bin froh, haben die Menschen dies möglich setzten Aufwand in der Herstellung -. Aber ich will noch wissen, ob es eine „richtige / sauber“ ist Art und Weise, dies zu erreichen

War es hilfreich?

Lösung

Resist schreiben Shell-Erweiterungen in verwalteten Sprachen -. Gibt es eine Vielzahl von Dingen, den Knall gehen könnte, wenn Sie diesen Weg verfolgen

Haben Sie einen browse durch diesen Thread für weitere Details. Es enthält Links, es zu tun, wenn wirklich will, und sagely Ratschläge, warum es kann getan werden, aber nicht sollte.

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

Sie sind zurück auf nicht verwalteten C / C ++ als einzige echte Werkzeuge hier.

Andere Tipps

Das ist keine gute Idee, wegen der möglichen Abhängigkeitsprobleme zwischen verschiedenen Versionen des .NET Framework. Ihre Shell-Erweiterung eine Version erwarten könnte, während eine andere Version bereits von der Anwendung geladen worden sein, die derzeit ausgeführt wird.

dieses Themas enthält eine gute Zusammenfassung der Situation.

Während andere schon erwähnt, dass Shell-Erweiterungen in reiner .NET zu schreiben wegen Rahmen Konflikten eine schlechte Idee ist, sollten Sie immer noch, dass beachten Sie:

  1. Es gibt 3rd-Party-Treiber gibt (siehe Eldos oder LogicNP), die für Sie die nicht verwaltete Seite tun, so dass Sie verwalteten Code schreiben, die mit dem nativen Treiber spricht, so Shell-bezogene CLR Versionskonflikte zu verhindern.

  2. Ein kürzlich MSDN-Artikel erwähnt, dass Microsoft dieses Problem für die CoreCLR gelöst hat, wie von Silverlight verwendet. Sie haben dies erreicht, indem mehrere Versionen der CLR ermöglicht im gleichen Prozess ausgeführt, so dass das Problem zu lösen. Der Autor erklärte weiter, dass dieses Update in Silverlight wird in zukünftigen Versionen des vollständigen CLR gerollt werden. (Das heißt, in Zukunft wird es durchaus möglich sein, Shell-Erweiterungen in verwaltetem Code zu schreiben.)

ich sie habe vor in C # getan. Es endet als eine verdammt viel schwieriger, als es sein sollte. Sobald Sie den Standardcode nach unten zu bekommen, obwohl, ist es einfach, neue Objekte zu rollen. Ich folgte diesen Link:

Link zu Info

Wie die früheren Kommentare erwähnen, ist es nicht die beste Idee, Shell-Erweiterungen in verwalteten Sprachen zu schreiben, aber ich dachte, ich würde ein Open-Source-Projekt teilen, die genau das tun:)

ShellGlue ist ein Managed-Shell-Erweiterung, die tatsächlich sehr hilfreich ist. Die Quelle könnten Sie auch hilfreich sein, wenn Sie daran interessiert sind bei der Verfolgung eine Shell-Erweiterung in C / C ++ geschrieben werden.

Neben den Einschränkungen, die die Umsetzung von über Shell-Erweiterungen in verwaltetem Code genannt wurden, was Sie im Grunde tun würde müssen, ist die folgende:

Zuerst eine COM-Komponente in C # erstellen, die die IShellExtInit IContextMenu Schnittstellen implementiert. Wie COM-Komponenten in C # erstellen beschrieben hier . Wie die notwendigen Schnittstellen zu implementieren ist in der diesem Artikel . Während die Beschreibung für eine C ++ Implementierung ist, können Sie dieses Wissen Sie C # Version gelten.

Ihre COM-Komponente wird GUID haben so genannte Class-ID oder CLSID. Sie müssen diese ID mit dem Dateityp als Kontextmenü Shell-Erweiterung registrieren:

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

Vergewissern Sie sich auch, dass Sie Ihre Komponente ordnungsgemäß registriert, wie in den C # COM-Tutorial beschrieben. Sie sollten es in der Registrierung unter

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

Viel Glück ...

Wie andere haben darauf hingewiesen, Shell-Erweiterungen sind nicht praktisch in den Fenstern Entwicklung zur Zeit.

Ich fragte eine ähnliche Frage vor kurzem , die mit einem Link zu einer Führung beantwortet wurden genau das zu tun, was ich

tun wollte
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top