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

Задача

Язык: C # 2.0 или более поздняя версия


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

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

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

Обновление


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

Ответы [ 7 ]

6 голосов
/ 23 сентября 2008

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

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

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

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

2 голосов
/ 23 сентября 2008

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

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

  2. В недавней статье MSDN упоминалось, что Microsoft решила эту проблему для CoreCLR, используемой Silverlight. Они достигли этого, позволив нескольким версиям CLR работать в одном и том же процессе, что позволило устранить проблему. Далее автор заявил, что это исправление в Silverlight будет включено в будущие версии полной версии CLR. (Это означает, что в будущем будет вполне возможно написать расширения оболочки в управляемом коде.)

2 голосов
/ 23 сентября 2008

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

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

2 голосов
/ 23 сентября 2008

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

В этой теме содержится хорошее краткое изложение ситуации.

1 голос
/ 06 марта 2009

Как уже отмечали другие, в настоящее время расширения оболочки не подходят для разработки Windows.

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

1 голос
/ 04 марта 2009

Помимо оговорок, которые были упомянуты относительно реализации расширений оболочки в управляемом коде, вам в основном нужно сделать следующее:

Сначала создайте 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=...
        ...

Удачи ...

1 голос
/ 23 сентября 2008

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

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

...