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

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

  •  02-07-2019
  •  | 
  •  

Вопрос

Проблема

Язык: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.Ваше расширение командной оболочки может ожидать одну версию, в то время как другое приложение, возможно, уже загрузило другую версию, запущенную в данный момент.

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top