Как я могу создать свои собственные обработчики контекста оболочки для Windows?

Проблема

Язык: C# 2.0 или новее


Я хотел бы зарегистрировать обработчики контекста для создания меню, когда пользователь щелкает правой кнопкой мыши определенные файлы (в моем случае * .eic). Какова процедура регистрации, отмены регистрации (очистки) и обработки событий (щелчков) из этих меню?

Я догадываюсь, что это как-то связано с реестром Windows, но, учитывая, сколько всего есть в .net, я не удивлюсь, если есть удобные способы сделать это легко и чисто.

Фрагменты кода, ссылки на веб-сайты, комментарии - все это хорошо. Пожалуйста, бросьте их мне.

Обновлять


Очевидно, есть небольшая проблема с созданием контекстных меню на управляемых языках, как прокомментировали несколько пользователей. Есть ли какой-либо другой предпочтительный способ достижения такого же поведения или мне следует потратить время на изучение этих обходных путей? Я совсем не против этого, я рад, что люди приложили усилия, чтобы это стало возможным, но я все же хочу знать, есть ли «правильный / чистый» способ достижения этого.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
2 760
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Воздержитесь от написания расширений оболочки на управляемых языках - есть множество вещей, которые могут пойти не так, если вы пойдете по этому пути.

Просмотрите эту ветку для получения более подробной информации. Он содержит ссылки, чтобы сделать это, если действительно хотите, и мудрые советы о том, почему это можно сделать, но не следует.

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

Вы вернулись к неуправляемому C / C++ как к вашим единственным реальным инструментам.

Начиная с CLR 4.0, боль, связанная с управляемыми расширениями оболочки, кажется, снимается ... channel9.msdn.com/shows/Going+Deep/…

stephbu 23.03.2010 06:14

Это не лучшая идея из-за потенциальных проблем зависимости между разными версиями .NET Framework. Ваше расширение оболочки может ожидать одну версию, в то время как другая версия, возможно, уже была загружена приложением, которое в настоящее время работает.

Эта ветка содержит хорошее описание ситуации.

Я делал их раньше на C#. Это оказывается намного сложнее, чем должно быть. Однако, как только вы получите шаблонный код, можно легко развернуть новые элементы. Я перешел по этой ссылке:

Ссылка на информацию

Как упоминалось в предыдущих комментариях, писать расширения оболочки на управляемых языках - не лучшая идея, но я подумал, что поделюсь проектом с открытым исходным кодом, который делает именно это :)

ShellGlue - это управляемое расширение оболочки, которое на самом деле весьма полезно. Источник также может быть вам полезен, если вы заинтересованы в написании расширения оболочки на C / C++.

В то время как другие уже упоминали, что написание расширений оболочки в чистом .NET - плохая идея из-за конфликтов фреймворков, вы все же должны помнить, что:

  1. Существуют сторонние драйверы (см. Eldos или LogicNP), которые выполняют неуправляемую часть за вас, позволяя вам писать управляемый код, который взаимодействует с собственным драйвером, тем самым предотвращая конфликты версий CLR, связанные с оболочкой.

  2. В недавней статье 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.

Я недавно задал похожий вопрос, на который был дан ответ со ссылкой на руководство, чтобы сделать именно то, что я хотел сделать

Другие вопросы по теме