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

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Problema

Idioma:C# 2.0 o posterior


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

Tengo una idea de que tiene algo que ver con el registro de Windows, pero teniendo en cuenta la cantidad de cosas que hay en .net, no me sorprendería que existieran métodos útiles para hacerlo de forma limpia y sencilla.

Los fragmentos de código, las referencias a sitios web y los comentarios son buenos.Por favor, tíramelos.

Actualizar


Evidentemente hay un pequeño problema al crear menús contextuales en lenguajes gestionados, como han comentado varios usuarios.¿Existe alguna otra forma preferida de lograr el mismo comportamiento o debería dedicar tiempo a buscar estas soluciones?No me importa hacer eso en absoluto, me alegro de que la gente se haya esforzado para hacerlo posible, pero todavía quiero saber si existe una forma "adecuada/limpia" de lograrlo.

¿Fue útil?

Solución

Resista escribir extensiones de Shell en lenguajes administrados: hay una multitud de cosas que podrían salir mal si sigue esta ruta.

Eche un vistazo a este hilo para obtener más detalles.Contiene enlaces para hacerlo si realmente lo desea, y sabios consejos sobre por qué se puede hacer, pero no se debe.

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

Ha vuelto a C/C++ no administrado como sus únicas herramientas reales aquí.

Otros consejos

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 es posible que la aplicación que se está ejecutando actualmente ya haya cargado una versión diferente.

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

Si bien otros ya mencionaron que escribir extensiones de shell en .NET puro es una mala idea debido a conflictos en el marco, aún debes tener en cuenta que:

  1. Existen controladores de terceros (consulte Eldos o LogicNP) que hacen el lado no administrado por usted, lo que le permite escribir código administrado que se comunica 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 ha resuelto este problema para CoreCLR, tal como lo utiliza Silverlight.Lo lograron permitiendo que se ejecutaran múltiples versiones de CLR en el mismo proceso, solucionando así el problema.El autor afirmó además que esta solución en Silverlight se implementará 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 muchísimo más difícil de lo que debería ser.Sin embargo, una vez que obtenga el código repetitivo, es fácil implementar nuevos elementos.Seguí este enlace:

Enlace a información

Como mencionan los comentarios anteriores, no es la mejor idea escribir extensiones de shell en lenguajes administrados, pero pensé en compartir un proyecto de código abierto que hace precisamente eso :)

Pegamento de concha es una extensión de shell administrada que en realidad es bastante útil.La fuente también podría resultarle útil si está interesado en seguir escribiendo una extensión de shell en C/C++.

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

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

Su componente COM tendrá un 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 COM de C#.Debería encontrarlo en el registro en

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 otros han señalado, las extensiones de shell no son prácticas actualmente en el desarrollo de Windows.

Hice una pregunta similar recientemente que fue respondido con un enlace a una guía para hacer exactamente lo que quería hacer

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top