Domanda

Problema

Lingua: C # 2.0 o successive


Vorrei registrare i gestori di contesto per creare menu quando l'utente fa clic con il pulsante destro del mouse su determinati file (nel mio caso * .eic). Qual è la procedura per registrare, annullare la registrazione (pulizia) e gestire gli eventi (clic) da questi menu?

Ho la minima idea che abbia a che fare con il registro di Windows, ma considerando quante cose ci sono in .net, non sarei sorpreso se ci sono metodi utili per farlo in modo semplice e pulito.

Frammenti di codice, riferimenti a siti Web, commenti sono tutti validi. Per favore, lanciali contro di me.

Aggiornamento


Ovviamente c'è un leggero problema nella creazione di menu di contesto nelle lingue gestite, come hanno commentato diversi utenti. Esiste un altro modo preferito per ottenere lo stesso comportamento o dovrei dedicare del tempo a esaminare queste soluzioni alternative? Non mi dispiace affatto farlo, sono contento che la gente abbia fatto uno sforzo per renderlo possibile - ma voglio ancora sapere se esiste un "corretto / pulito". modo per raggiungere questo obiettivo.

È stato utile?

Soluzione

Resistete a scrivere le estensioni della shell in lingue gestite: ci sono moltissime cose che potrebbero andare in rovina se seguite questa strada.

Sfoglia questo thread per maggiori dettagli. Contiene collegamenti per farlo, se proprio lo desidera, e saggiamente consigli sul perché può essere fatto, ma non dovrebbe.

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

Sei tornato al C / C ++ non gestito come il tuo unico vero strumento qui.

Altri suggerimenti

Questa non è una buona idea a causa di potenziali problemi di dipendenza tra diverse versioni di .NET Framework. L'estensione della shell potrebbe essere in attesa di una versione, mentre una versione diversa potrebbe essere già stata caricata dall'applicazione attualmente in esecuzione.

Questa discussione contiene un buon riassunto della situazione.

Mentre altri hanno già detto che scrivere estensioni di shell in .NET puro è una cattiva idea a causa di conflitti di framework, dovresti comunque notare che:

  1. Esistono driver di terze parti (vedi Eldos o LogicNP) che eseguono il lato non gestito per te, consentendoti di scrivere codice gestito che comunica con il driver nativo, evitando così conflitti di versione CLR relativi alla shell.

  2. Un recente articolo MSDN ha menzionato che Microsoft ha risolto questo problema per il CoreCLR, usato da Silverlight. Hanno raggiunto questo obiettivo consentendo l'esecuzione di più versioni del CLR nello stesso processo, risolvendo così il problema. L'autore ha inoltre affermato che questa correzione in Silverlight verrà implementata nelle versioni future del CLR completo. (Significato, in futuro, sarà abbastanza fattibile scrivere estensioni di shell nel codice gestito.)

Li ho già fatti in C #. Finisce per essere un inferno molto più difficile di quanto dovrebbe essere. Una volta ottenuto il codice del boilerplate, tuttavia, è facile implementare nuovi articoli. Ho seguito questo link:

Link alle informazioni

Come menzionato nei commenti precedenti, non è la migliore idea di scrivere estensioni di shell in lingue gestite, ma ho pensato di condividere un progetto Open Source che sta facendo proprio questo :)

ShellGlue è un'estensione della shell gestita che in realtà è abbastanza utile. La fonte potrebbe anche esserti utile se sei interessato a continuare a scrivere un'estensione shell in C / C ++.

A parte le avvertenze che sono state menzionate riguardo all'implementazione delle estensioni della shell nel codice gestito, ciò che dovresti sostanzialmente fare è il seguente:

Innanzitutto, creare un componente COM in C # che implementa le interfacce ISonteExtInit IContextMenu. Come creare componenti COM in C # è descritto qui . Come implementare le interfacce necessarie è descritto in questo articolo . Mentre la descrizione è per un'implementazione C ++, puoi applicare quella conoscenza alla tua versione C #.

Il componente COM avrà GUID chiamato Class-ID o CLSID. Devi registrare quell'ID con il tuo tipo di file come estensione shell del menu contestuale:

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

Assicurarsi inoltre di aver registrato correttamente il componente come descritto nell'esercitazione COM di C #. Dovresti trovarlo nel registro sotto

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

Buona fortuna ...

Come altri hanno sottolineato, attualmente le estensioni della shell non sono pratiche nello sviluppo di Windows.

Di recente ho posto una domanda simile alla quale è stato risposto con un link a una guida fare esattamente quello che volevo fare

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top