Como posso criar meus manipuladores de contexto personalizado Shell para Windows?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Problema

Idioma: C # 2.0 ou posterior


Eu gostaria de registrar manipuladores de contexto para criar menus quando o direito de utilizador clica determinados arquivos (no meu caso * .eic). Qual é o procedimento para registar, cancelar o registro (limpeza) e eventos do punho (cliques) a partir destes menus?

Eu tenho uma pista que é algo a ver com o registro do Windows, mas considerando a quantidade de coisas que há em .net, eu não ficaria surpreso se existem métodos úteis para fazer isso limpo e fácil.

Os trechos de código, referências a sites, os comentários são todos bons. Por favor, atirá-los para mim.

Atualização


Obviamente, há um ligeiro problema ao criar menus de contexto em idiomas gerenciados, como vários usuários comentaram. Existe alguma outra forma preferida de alcançar o mesmo comportamento, ou devo passar o tempo olhando para essas soluções alternativas? Eu não me importo de fazer isso em tudo, estou contente por as pessoas têm colocado esforço em tornar isso possível -. Mas eu ainda quero saber se existe uma maneira "apropriada / limpa" de alcançar esse

Foi útil?

Solução

Resista escrever Shell Extensions em idiomas gerenciados -. Há uma infinidade de coisas que poderiam dar estrondo se você seguir essa rota

Tenha uma percorrer esta discussão para mais detalhes. Ele contém links para fazê-lo se realmente querem, e aconselhamento sagely de por que isso pode ser feito, mas não deve.

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

Você está de volta para não gerenciado C / C ++ como suas ferramentas Apenas real aqui.

Outras dicas

Esta não é uma boa idéia por causa de potenciais problemas de dependência entre as diferentes versões do .NET Framework. Sua extensão de shell poderia estar esperando uma versão, enquanto uma versão diferente pode já ter sido carregado pelo aplicativo que está actualmente em execução.

Esta discussão contém um resumo bom da situação.

Enquanto outros já mencionado que escrever extensões de shell em .NET pura é uma má idéia devido a conflitos de estrutura, você ainda deve observar que:

  1. Há motoristas 3rd party lá fora (ver EldoS ou LogicNP) que faz o lado não gerenciado para você, permitindo-lhe escrever código gerenciado que fala com o driver nativo, evitando assim conflitos de versão CLR shell-relacionado.

  2. Um artigo recente MSDN mencionado que a Microsoft tem resolvido este problema para o CoreCLR, como o usado por Silverlight. Eles conseguiram isso, permitindo que múltiplas versões do CLR para executar no mesmo processo, fixando assim o problema. O autor afirmou ainda que essa correção no Silverlight será rolado em futuras versões do CLR completo. (Ou seja, no futuro, será bastante viável para escrever extensões de shell em código gerenciado.)

Eu fiz-los antes em C #. Ele acaba sendo um inferno de muito mais difícil do que deveria ser. Depois de conseguir o baixo código clichê, porém, é fácil para a implantação de novos itens. Eu segui este link:

Link para Informações

Como os comentários anteriores mencionar, não é a melhor idéia para extensões de shell de escrita em línguas gerenciados, mas eu pensei que eu iria partilhar um projeto Open Source que está fazendo exatamente isso:)

ShellGlue é uma extensão shell gerenciado que é realmente muito útil. A fonte também pode ser útil para você, se você está interessado em prosseguir escrevendo uma extensão de shell em C / C ++.

Além das ressalvas que foram mencionados relativo à execução de extensões de shell em código gerenciado, o que você basicamente precisa fazer é o seguinte:

Primeiro, crie um componente COM em C # que implementa as interfaces IShellExtInit IContextMenu. Como criar componentes COM em C # é descrito aqui . Como implementar as interfaces necessárias são descritas no este artigo . Embora a descrição é para uma implementação C ++, você pode aplicar esse conhecimento para você C version #.

O seu componente COM terá GUID chamado de Classe-ID ou CLSID. Você precisa registrar esse ID com o seu tipo de arquivo como uma extensão de shell-menu de contexto:

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

Também certifique-se de que você registrou o seu componente corretamente, conforme descrito no C # COM tutorial. Você deve encontrá-lo no registro em

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

Boa sorte ...

Como outros apontaram, extensões de shell não são práticos no desenvolvimento de janelas atualmente.

Eu fiz uma pergunta semelhante recentemente que foi respondido com um link para um guia fazer exatamente o que eu queria fazer

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top