¿Cómo puedo crear mis controladores de contexto de shell personalizados para Windows?

Problema

Idioma: C # 2.0 o posterior


Me gustaría registrar controladores de contexto para crear menús cuando el usuario haga clic derecho en ciertos archivos (en mi caso * .eic). ¿Cuál es el procedimiento para registrar, anular el registro (limpiar) y manejar eventos (clics) de estos menús?

Tengo una pista de que es algo que tiene que ver con el registro de Windows, pero teniendo en cuenta la cantidad de cosas que hay en .net, no me sorprendería si hubiera métodos prácticos para hacer esto de manera limpia y sencilla.

Fragmentos de código, referencias de sitios web, comentarios son buenos. Por favor, tíralos a mí.

Actualizar


Obviamente, existe un pequeño problema al crear menús de contexto en idiomas administrados, como han comentado varios usuarios. ¿Hay alguna otra forma preferida de lograr el mismo comportamiento, o debo pasar tiempo estudiando estas soluciones? No me importa hacer eso en absoluto, me alegra que la gente haya hecho un esfuerzo para hacer que esto sea posible, pero todavía quiero saber si existe una forma “adecuada / limpia” de lograrlo.

Evite escribir Shell Extensions en lenguajes administrados: hay una multitud de cosas que podrían explotar si sigue esta ruta.

Echa un vistazo a este hilo para más detalles. Contiene enlaces para hacerlo si realmente lo desea, y sabiamente consejos sobre por qué se puede hacer, pero no debería.

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

Vuelve al C / C ++ no administrado como sus únicas herramientas reales aquí.

Esta no es una buena idea debido a posibles problemas de dependencia entre diferentes versiones de .NET Framework. Su extensión de shell podría estar esperando una versión, mientras que la aplicación que se está ejecutando ya puede haber cargado una versión diferente.

Este hilo contiene un buen resumen de la situación.

Mientras que otros ya mencionaron que escribir extensiones de shell en .NET puro es una mala idea debido a los conflictos del marco, debe tener en cuenta que:

  1. Hay controladores de terceros (ver Eldos o LogicNP) que hacen el lado no administrado por usted, lo que le permite escribir código administrado que habla con el controlador nativo, evitando así conflictos de versión CLR relacionados con el shell.

  2. Un artículo reciente de MSDN mencionó que Microsoft resolvió este problema para CoreCLR, tal como lo utiliza Silverlight. Lo han logrado al permitir que se ejecuten varias versiones de CLR en el mismo proceso, lo que soluciona el problema. El autor declaró además que esta solución en Silverlight se incluirá en versiones futuras del CLR completo. (Es decir, en el futuro, será bastante factible escribir extensiones de shell en código administrado).

Los he hecho antes en C #. Termina siendo mucho más difícil de lo que debería ser. Sin embargo, una vez que haya bajado el código de la placa, es fácil desplegar nuevos elementos. Seguí este enlace:

Enlace a la información

Como mencionan los comentarios anteriores, no es la mejor idea escribir extensiones de shell en lenguajes administrados, pero pensé que compartiría un proyecto de código abierto que está haciendo precisamente eso 🙂

ShellGlue es una extensión de shell administrada que en realidad es bastante útil. La fuente también puede ser útil si está interesado en escribir una extensión de shell en C / C ++.

Aparte de las advertencias que se han mencionado sobre la implementación de extensiones de shell en código administrado, lo que básicamente debería hacer es lo siguiente:

Primero, cree un componente COM en C # que implemente las interfaces IShellExtInit IContextMenu. A continuación se describe cómo crear componentes COM en C #. En este artículo se describe cómo implementar las interfaces necesarias. Si bien la descripción es para una implementación de C ++, puede aplicar ese conocimiento a su versión de C #.

Su componente COM tendrá GUID llamado Class-ID o CLSID. Debe registrar esa ID con su tipo de archivo como una extensión de shell del menú contextual:

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

También asegúrese de haber registrado su componente correctamente como se describe en el tutorial de C # COM. Deberías encontrarlo en el registro bajo.

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

Buena suerte…

Como han señalado otros, las extensiones de shell no son prácticas en el desarrollo de Windows actualmente.

Hace poco hice una pregunta similar que fue respondida con un enlace a una guía para hacer exactamente lo que quería hacer