Язык: C# 2.0 или новее
Я хотел бы зарегистрировать обработчики контекста для создания меню, когда пользователь щелкает правой кнопкой мыши определенные файлы (в моем случае * .eic). Какова процедура регистрации, отмены регистрации (очистки) и обработки событий (щелчков) из этих меню?
Я догадываюсь, что это как-то связано с реестром Windows, но, учитывая, сколько всего есть в .net, я не удивлюсь, если есть удобные способы сделать это легко и чисто.
Фрагменты кода, ссылки на веб-сайты, комментарии - все это хорошо. Пожалуйста, бросьте их мне.
Очевидно, есть небольшая проблема с созданием контекстных меню на управляемых языках, как прокомментировали несколько пользователей. Есть ли какой-либо другой предпочтительный способ достижения такого же поведения или мне следует потратить время на изучение этих обходных путей? Я совсем не против этого, я рад, что люди приложили усилия, чтобы это стало возможным, но я все же хочу знать, есть ли «правильный / чистый» способ достижения этого.





Воздержитесь от написания расширений оболочки на управляемых языках - есть множество вещей, которые могут пойти не так, если вы пойдете по этому пути.
Просмотрите эту ветку для получения более подробной информации. Он содержит ссылки, чтобы сделать это, если действительно хотите, и мудрые советы о том, почему это можно сделать, но не следует.
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/1428326d-7950-42b4-ad94-8e962124043e/
Вы вернулись к неуправляемому C / C++ как к вашим единственным реальным инструментам.
Это не лучшая идея из-за потенциальных проблем зависимости между разными версиями .NET Framework. Ваше расширение оболочки может ожидать одну версию, в то время как другая версия, возможно, уже была загружена приложением, которое в настоящее время работает.
Эта ветка содержит хорошее описание ситуации.
Я делал их раньше на C#. Это оказывается намного сложнее, чем должно быть. Однако, как только вы получите шаблонный код, можно легко развернуть новые элементы. Я перешел по этой ссылке:
Как упоминалось в предыдущих комментариях, писать расширения оболочки на управляемых языках - не лучшая идея, но я подумал, что поделюсь проектом с открытым исходным кодом, который делает именно это :)
ShellGlue - это управляемое расширение оболочки, которое на самом деле весьма полезно. Источник также может быть вам полезен, если вы заинтересованы в написании расширения оболочки на C / C++.
В то время как другие уже упоминали, что написание расширений оболочки в чистом .NET - плохая идея из-за конфликтов фреймворков, вы все же должны помнить, что:
Существуют сторонние драйверы (см. Eldos или LogicNP), которые выполняют неуправляемую часть за вас, позволяя вам писать управляемый код, который взаимодействует с собственным драйвером, тем самым предотвращая конфликты версий CLR, связанные с оболочкой.
В недавней статье MSDN упоминалось, что Microsoft решила эту проблему для CoreCLR, используемого Silverlight. Они достигли этого, позволив нескольким версиям CLR работать в одном процессе, тем самым устранив проблему. Автор также заявил, что это исправление в Silverlight будет добавлено в будущие версии полной CLR. (Это означает, что в будущем будет вполне возможно писать расширения оболочки в управляемом коде.)
Помимо упомянутых предостережений относительно реализации расширений оболочки в управляемом коде, вам в основном необходимо сделать следующее:
Сначала создайте COM-компонент на C#, который реализует интерфейсы IShellExtInit IContextMenu. Как создавать компоненты COM на C# описано здесь. Как реализовать необходимые интерфейсы, описано в эта статья. Хотя описание относится к реализации на C++, вы можете применить эти знания к своей версии C#.
У вашего COM-компонента будет GUID, который называется Class-ID или CLSID. Вам необходимо зарегистрировать этот идентификатор с вашим типом файла в качестве расширения оболочки контекстного меню:
HKEY_CLASSES_ROOT\.eic\ShellEx\ContextMenuHandlers\MyShellExt
(Default) -> {YOUR-COMPONENTS-CLSID}
Также убедитесь, что вы правильно зарегистрировали свой компонент, как описано в руководстве C# COM. Вы должны найти его в реестре под
HKEY_CLASSES_ROOT\CLSID\{YOUR-COMPONENTS-CLSID}
InprocServer32
(Default) -> C:\WINDOWS\system32\mscoree.dll
Class -> YourImplClass
assembly -> YourAssembly, version=..., Culture=neutral, PublicKey=...
...
Удачи...
Как отмечали другие, в настоящее время расширения оболочки нецелесообразны при разработке Windows.
Я недавно задал похожий вопрос, на который был дан ответ со ссылкой на руководство, чтобы сделать именно то, что я хотел сделать
Начиная с CLR 4.0, боль, связанная с управляемыми расширениями оболочки, кажется, снимается ... channel9.msdn.com/shows/Going+Deep/…