Shell extensions что это

Shell extensions что это

Определения

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

Для реализации задуманного нам понадобятся интерфейсы IContextMenu и IShellFolder. Указатель на главный интерфейс IshellFolder, соответствующий «Рабочему столу» оболочки, можно получить, используя функцию SHGetDesktopFolder, объявление которой выглядит так:

Синтаксис первой и последней функции, я думаю, понятен и без разъяснений. Функция TrackPopupMenu, собственно, и выводит на экран контекстное меню. Параметры этой функции принимают значения:

function ParseDisplayName (hwndOwner: HWND;pbcReserved: Pointer; lpszDisplayName: POLESTR; out pchEaten: ULONG;out ppidl: PItemIDList; var dwAttributes: ULONG): HResult; stdcall;

После удачного завершения надо бы перейти к классу родителя нашего NotePad.exe. Воспользуемся для этого функцией IShellFolder.BindToObject, объявленной следующим образом:

И после очередной строчки кода:

мы получим в переменной ShellFolder0 указатель на интерфейс IShellFolder, соответствующий папке C:\Windows. Теперь мы можем узнать PItemIDList нашего NotePad:

Для чего все это было написано?

Теперь мы без зазрений совести можем приступать к выводу нашего контекстного меню:

Обработка результата команды TrackPopupMenu:

Недоработки…

…а где их нет? То есть, конечно, этот компонент работает, я его использую, но в нем (пока) отсутствуют некоторые полезные функции. К примеру, если вы заглянете в файл ShlObj.pas, то обнаружите, что там, помимо использованного нами интерфейса IcontextMenu, объявлены также интерфейсы IContextMenu2 и IContextMenu3, которые используются для расширения базовых функций интерфейса (к примеру, IContextMenu2 используется для работы с элементами подменю). Кроме того, небольшая доработка компонента даст возможность включать в него свои собственные пункты меню (сравните рис. 3 и рис. 4).

Источник

Разработка Shell Extensions для Windows Explorer

Для повышения удобства разрабатываемых продуктов, мы стараемся обеспечить максимальный уровень интеграции функционала в операционную систему, чтобы пользователю было удобно использовать весь потенциал приложения. В этой статье будут рассмотрены теоретические и практические аспекты разработки Shell Extensions, компонентов позволяющих интегрироваться в оболочку операционной системы Windows. В качестве примера рассмотрим расширение списка контекстного меню для файлов, а так же проведем обзор уже существующих решений в этой области.

Вообще говоря, существует огромное множество вариантов интеграционных компонентов оболочки операционной системы Windows, например: апплеты панели управления, хранители экрана и прочее, однако в данной статье мне бы хотелось подробнее остановиться на возможностях расширения Windows Explorer, компонента ОС, который мне приходилось расширять больше остальных, ввиду его функциональной нагрузки.

Добавим в Assembly.cs следующие директивы, позволяющие использовать нашу сборку как COM объект:

Нам понадобиться импортировать некоторые функции Windows API.

Функция DragQueryFile позволит нам получить список файлов выбранных в каталоге, SHChangeNotify оповестить операционную систему о том, что оболочка была изменена.

Так как мы разрабатываем COM объект, который расширяет контекстное меню, мы должны реализовать интерфейс IShellExtInit. В методе Initialize мы получим базовую информацию о каталоге, в котором выполняемся.

Также необходимо описать и реализовать COM интерфейс IContextMenu. Значение поля PreserveSig, равное true, инициирует непосредственное преобразование неуправляемых сигнатур со значениями HRESULT или retval, а значение false вызывает автоматическое преобразование значений HRESULT или retval в исключения. По умолчанию для поля PreserveSig используется значение true.

Метод QueryContextMenu будет вызван при вызове контекстного меню, в нем нам будет нужно реализовать функционал по добавлению пункта меню, GetCommandString будет возвращать некоторые детали по данной команде, ее описание и прочее. InvokeCommand будет вызван при выборе пункта меню, который мы добавим.

Для COM объекта так же необходимо реализовать функции установки и удаления.

В этой функции мы выполняем регистрацию нашего компонента в реестре, так как у нас компонент расширяющий функционал контекстного меню, мы регистрируемся в разделе ContextMenuHandlers (*\\shellex\\ContextMenuHandlers\\ExShell). После регистрации перезапускаем процесс explorer.exe для того, чтобы наши изменения сразу вступили в силу.

Функция удаления компонента, очищаем реестр от созданных ранее ключей.
Далее переходим к процессу реализации интерфейсных функций.Реализуем интерфейсы IShellExtInit, IContextMenu. Не буду детально описывать весь код этого класса, остановлюсь на реализации функций данных интерфейсов.

Функция инициализации компонента, запускается при открытии каталога или любого другого объекта, в контексте которого может находиться контекстное меню. Используем интерфейс IDataObject для получения данных о текущем объекте, в частности нас интересует hGlobal. Этот Handle идентифицирует текущий объект, внутри которого и происходит наше выполнение.

Далее рассмотрим функцию, которая вызывается при выпадении контекстного меню.

В этом участке кода проверяем, что выполняемся в нужном контексте и пытаемся запросить количество выбранных в каталоге файлов, а так же сохранить список этих файлов. Также замечу, что при передаче iFile = 0xffffffff в функцию DragQueryFile она вернет количество файлов в каталоге.

Здесь добавляем новый пункт меню при помощи вызова функции InsertMenuItem, затем подготавливаем и добавляем иконку к этому пункту меню, а так же разделительную линию для эстетической красоты. Структура MENUITEMINFO описывает наш пункт меню, а именно его тип (ftype), содержащиеся данные (dwTypeData), состояние (fState), идентификатор пункта меню (wID). Переменная hMenu идентифицирует текущее выпавшее меню, iMenu позиция по которой мы добавляемся. Для того, чтобы получить более полную информацию, можно обратиться в MSDN.

Далее рассмотрим функцию GetCommandString

Данная функция возвращает независимое от языка описание команды, а так же краткую подсказку в виде helptext соответственно.

Ну и последняя функция, которая будет вызвана при выборе нашего пункта меню:

Тут все достаточно прозрачно.

Вот так выглядит наш компонент в ShellExView:
Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

Так он выглядит при раскрытом контекстном меню:
Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

P.S Расширение не тестировал на Windows 8, судя по отзывам, для корректной работы в реестре нужно установить в разделе HKEY_CLASSES_ROOT\CLSID\\InprocServer32 следующее значение ThreadingModel = Apartment.

Источник

Пошаговое руководство по написанию расширения


Автор: Michael Dunn
Перевод: Инна Кирюшкина
Алексей Кирюшкин
Источник: The Code Project

Опубликовано: 17.04.2001
Исправлено: 24.02.2006
Версия текста: 1.3

Часть I является введением в расширения оболочки, а также содержит пример расширения контекстного меню.

Что представляют собой расширения оболочки?

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

ТипыКогда загружаютсяЧто делают
Обработчик контекстного менюПравый щелчок на файле или папке. В версиях оболочки 4.71+ также правый щелчок на фоне окна, отображающего каталог.Добавляет пункты к контекстному меню.
Обработчик страниц свойствПри отображении свойств файловДобавляет страницы свойств
Обработчик перетаскиванияПользователь перетаскивает файлы правой кнопкой мыши в окно каталога или на рабочий столДобавляет пункты к контекстному меню, появляющемуся при отпускании кнопки.
Обработчик сбрасыванияПользователь перетаскивает и сбрасывает объекты на файлЛюбое желаемое действие
Всплывающие описанияУказатель мыши находится над файлом или другим объектомВозвращает строку, которая отображается во всплывающей подсказке.

Shell extensions что это. . Shell extensions что это фото. Shell extensions что это-. картинка Shell extensions что это. картинка

WinZip содержит код, который добавляет пункты в меню, обеспечивает подсказку (текст, который появляется в строке состояния проводника), и выполняет нужные действия, когда пользователь выбирает одну из команд WinZip. WinZip также содержит обработчик перетаскивания. Этот тип расширения очень похож на расширение контекстного меню, но он загружается, когда пользователь перетаскивает файл, используя правую кнопку мыши. Вот что этот обработчик добавляет к контекстному меню:

Shell extensions что это. . Shell extensions что это фото. Shell extensions что это-. картинка Shell extensions что это. картинка

Существует много других типов и Microsoft продолжает добавлять их в каждой новой версии Windows. Сейчас мы рассмотрим расширения контекстного меню, поскольку они легко и просто пишутся и в результате красиво смотрятся (одно удовольствие!).

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

и установим начальное значение = 1. В Windows 9x это самый лучший выход.

В Windows NT/2000 откроем раздел:

создадим параметр типа DWORD, назовем его DesktopProcess и установим значение = 1.

При этом рабочий стол и панель задач запустятся в одном процессе и последующие окна проводника запускаются каждое в своем собственном процессе. Это позволит вам делать отладку в одном окне проводника, и когда вы его закроете, ваша DLL автоматически выгрузится, и вы избегните проблем с использованным файлом. Вам необходимо сделать перерегистрацию в Windows, чтобы эти изменения вступили в силу.

Как делать отладку в 9x я объясню немного позже.

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

Использование AppWizard.

Я еще не рассказал вам, как использовать интерфейсы расширений оболочки? Не беспокойтесь, я объясню, когда дойду до этого. Это лучше усвоится, если будет сопровождаться примерами. Я объясню понятия и буду сопровождать их кодом примера. Можно было-бы объяснить все сначала, а затем дать код, но я нахожу, что это тяжелее для понимания.

В любом случае запускайте MS VC и мы начнем.

Интерфейс инициализации

Чтобы добавить IShellExtInit к нашему проекту, откройте SimpleShExt.h и введите выделенные строки:

В SimpleShlExt.cpp добавьте определение функции:

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

Теперь, когда мы имеем дескриптор HDROP, мы можем получить нужное имя файла:

Интерфейс взаимодействия с контекстным меню

А затем добавим прототипы методов IContextMenu:

Модификация контекстного меню

Я следовал объяснениям Dino в коде, написанном мною. Его метод получения возвращаемого значения эквивалентен методу on-line MSDN до тех пор, пока вы считаете количество пунктов вашего меню с помощью uidFirstCmd и прибавляете 1 для каждого добавленного пункта. Наше простое расширение будет иметь только один пункт, поэтому функция QueryContextMenu() совсем проста:

Отображение подсказки в строке состояния

Код нашей GetCommandString() выглядит так:

Здесь нет ничего фантастического. Я просто преобразовываю строку в подходящий набор символов. Если вы никогда не использовали ATL макросов конвертирования, вы определенно должны прочитать о них, т.к. они намного облегчают жизнь, когда необходимо передать строку UNICODE COM-методам и OLE-функциям. Я использую T2CW и T2CA в коде, приведенном выше, чтобы преобразовать строку в UNICODE и ANSI соответственно. Макрос USES_CONVERSION в начале функции объявляет локальную переменную, которая используется в конверсионных макросах.

Выполнение выбора пользователя


Регистрация расширения оболочки

Итак, мы осуществили все интерфейсы, но как сделать, чтобы проводник мог использовать наше расширение? ATL автоматически генерирует код, который регистрирует нашу DLL как COM сервер, но это всего лишь позволит другим приложениям использовать нашу DLL. Для того чтобы сообщить проводнику, что наше расширение существует, мы должны зарегистрировать его в секции, которая содержит информацию о TXT-файлах:

и установим его default значение согласно нашему GUID:»<5E2121EE-0300-11D4-8D3B-444553540000>«.

Вот как выглядят данные для регистрации:

ОК. Конец статьи. Последняя деталь о регистрации. В Windows NT/2000 мы также должны внести наше расширение в список «одобренных» расширений. Если мы этого не сделаем, наше расширение не будет доступно пользователю, который не имеет прав администратора. Этот список находится в

Отладка расширения оболочки


Как все это выглядит?

Так выглядит контекстное меню после добавления нашего пункта:

Shell extensions что это. . Shell extensions что это фото. Shell extensions что это-. картинка Shell extensions что это. картинка

Так выглядит строка статуса с выведенной подсказкой:

Shell extensions что это. . Shell extensions что это фото. Shell extensions что это-. картинка Shell extensions что это. картинка

А так выглядит сообщение, показывающее имя файла, который был отмечен:

Shell extensions что это. . Shell extensions что это фото. Shell extensions что это-. картинка Shell extensions что это. картинка

Продолжение следует.

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

Источник

Работаем с жёсткими и символическими ссылками в Windows (часть 2)

— Это продолжение статьи. Начало читайте здесь.

Рассмотренный в прошлой заметке набор расширений для «Проводника» ограничен возможностями старых версий Windows и NTFS и позволяет создавать жёсткие ссылки на файлы и мягкие — на каталоги. В программе Link Shell Extension этой проблемы нет, но её установка и использование немного сложнее.

Как и в предыдущем случае, продукт поставляется бесплатно для всех актуальных версий Windows, но пользователю придётся самостоятельно инсталлировать необходимые библиотеки Microsoft Visual C++, скачав с сайта файл вида «vcredist_платформа.exe» и запустив его с правами администратора. Далее устанавливается сама программа для соответствующей платформы. Кроме того, рекомендуется использовать некий драйвер поддержки символических ссылок в Windows XP — он доступен для процессорных архитектур x86 и x64, устанавливается с помощью утилиты senable.exe с параметром install из командной строки (предварительно нужно распаковать архив) и позволяет делать символические ссылки не только на каталоги, но и на файлы.

Shell extensions что это. symlink 01. Shell extensions что это фото. Shell extensions что это-symlink 01. картинка Shell extensions что это. картинка symlink 01Утилита настройки

При инсталляции Link Shell Extension можно выбрать русский язык, но контекстные меню «Проводника» локализованы не полностью, а утилита настройки и вовсе не переведена на русский язык. Использование расширения напоминает обычное копирование и вставку: из контекстного меню работы с файлом или каталогом нужно выбрать пункт «Запомнить источник», а затем «Поместить как». Здесь же можно отменить действие.

Shell extensions что это. symlink 02. Shell extensions что это фото. Shell extensions что это-symlink 02. картинка Shell extensions что это. картинка symlink 02

Shell extensions что это. symlink 03. Shell extensions что это фото. Shell extensions что это-symlink 03. картинка Shell extensions что это. картинка symlink 03

Расширение позволяет создавать ссылки перетаскиванием объекта с зажатой правой кнопкой мыши (когда пользователь её отпускает, появляется контекстное меню), а также добавляет новую закладку в окно просмотра свойств файла и выделяет ссылки специальным значком, добавляющимся к стандартной иконке.

Shell extensions что это. symlink 04. Shell extensions что это фото. Shell extensions что это-symlink 04. картинка Shell extensions что это. картинка symlink 04Дополнительная закладка в свойствах файла

К сожалению, в Windows нельзя создавать жёсткие ссылки на каталоги, но имеется похожий объект под названием Junction (связь). Он создается и используется почти аналогично и помечается специальным значком с несколькими звеньями цепи. Единственное важное отличие от хардлинка: если удалить исходную папку, то связь будет ссылаться на недоступное место. Источник связи, а также симлинка на каталог можно заменить перетаскиванием (с нажатой правой кнопкой мыши) или через контекстное меню, выбрав предварительно новый источник.

Shell extensions что это. symlink 05. Shell extensions что это фото. Shell extensions что это-symlink 05. картинка Shell extensions что это. картинка symlink 05Замена источника символической ссылки

Но самые интересные возможности касаются копирования каталогов. Можно, к примеру, клонировать каталог таким образом, что подкаталоги копии останутся подкаталогами, а файлы будут заменены на мягкие или жёсткие ссылки. Решены здесь и проблемы копирования содержащих ссылки каталогов — пользователь может сохранять их логику различными способами. Есть в наборе расширений монтирование разделов в каталог (в качестве источника нужно выбрать раздел) и многое другое — полное описание не уместится в короткой заметке. Подробная информация обо всех функциях Link Shell Extensions доступна на сайте проекта.

Проект активно развивается, и в нём находят недочёты. Например, выскакивающий диалог контроля учётных записей пользователей при выполнении операций с символическими ссылками и связями в Windows 7 и Vista. Могут быть проблемы со съёмными носителями и бог знает что ещё. Важно понимать, что это программное обеспечение вы используете на свой страх и риск, и устанавливать его на рабочую машину неопытным пользователям категорически не рекомендуется.

Источник

GNOME Shell Extensions

В комментариях к новой версии GNOME3 в процессе обсуждения недостатков среды предсказуемо стали проскакивать различные рецепты борьбы с ними с помощью расширений. С помощью беглого поиска по Хабру я нашел несколько статей описывающих конкретные расширения и ссылку на единую базу расширений. Статьи за два года заметно устарели, а базой, по-моему, можно пользоваться только путем перебора всех имеющихся расширений. Поэтому я предлагаю обсудить и собрать в одном месте кто какие расширения использует и какие лучше. Вероятно кто-то среди предложенных расширений найдет решение своей проблемы и обретет счастье. Для затравки опишу расширения, которые кажутся мне интересными и полезными. Кто заинтересовался — прошу под кат.

Осторожно! Много иллюстраций.

Remove Accessibility

Удаляет из верхней панели кнопку специальных возможностей (внешне похожа на витрувианского человека).

Alternative Status Menu

Заменяет пункт правого меню «Завершить сеанс» на пункты сна, гибернации и выключения компьютера. Для последних версий GNOME, кажется, уже не актуально.

Weather

Погода. Небольшой удобный значок при необходимости раскрывающийся в большую информативную панель.

Shell extensions что это. 1ac01383892ec511bfa430d1ee31fdbb. Shell extensions что это фото. Shell extensions что это-1ac01383892ec511bfa430d1ee31fdbb. картинка Shell extensions что это. картинка 1ac01383892ec511bfa430d1ee31fdbb

Advanced Settings in UserMenu

Добавляет в правое меню пункт Gnome Tweak Tool. Если вдруг кто не знает — это утилита для настройки самого GNOME Shell-a. В частности позволяет включать\выключать дополнения, устанавливать их в виде архивов, настраивать формат времени и даты и многое другое.

Applications Menu

Добавляет на верхнюю панель выпадающее каскадное меню приложений.

Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

Sensors

Добавляет на верхнее меню индикатор температуры ЦП.

Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

Advanced Calculator

Встраивает в меню поиска по приложениям функции калькулятора.

Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

Pidgin Conversation Integration

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

Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

Todo list

Добавляет в верхнее меню значок списка дел. Несмотря на очень простой функционал: показ количества задач (в значке), добавление задачи (обычный текстовый инпут) и удаление задачи (клик по задаче) — дополнение крайне полезно. Не нужно никаких листиков и резкой смены контекста. Кроме удобства создания, еще, лично мне, чисто психологически приятно вычеркивать пункты и смотреть как тают цифры открытых задач.

Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

Text Translator

Интегрирует он-лайн переводчик (Google либо Яндекс) в shell. Кроме быстрого запуска с помощью кнопки из верхней панели поддерживает ряд хоткеев: T — просто запуска, T — запуск с автоподставленным буфером и т.д.

Shell extensions что это. 20cdc21a482ae5521d872a35958ccf66. Shell extensions что это фото. Shell extensions что это-20cdc21a482ae5521d872a35958ccf66. картинка Shell extensions что это. картинка 20cdc21a482ae5521d872a35958ccf66

Uptime Indicator

Для тех кто любит мерится аптаймом. Добавляет на верхнюю панель значение аптайма.

Добавляет слева список запущенных приложений, а также приложения добавленные в избранное.

Jenkins CI Server Indicator

Позволяет отслеживать все ваши задачи в Jenkins. Расширение имеет множество настроек. При малом интервале обновления может заметно утяжелить GNOME Shell.

Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

Brightness Control

Добавляет на верхнюю панель кнопку управления яркостью подсветки.

Media player indicator

Встраивает управление музыкальным плеером в управление звуком.

Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

Status Area Horizontal Spacing

Уменьшает расстояния между иконками в верхней панеле.

Shell extensions что это. image loader. Shell extensions что это фото. Shell extensions что это-image loader. картинка Shell extensions что это. картинка image loader

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

Описанные мною расширения лишь малая часть моря полезностей написанных для GNOME Shell. Я надеюсь вы тоже поделитесь своими находками и вместе мы сделаем наше общение с GNOME3 еще прекрасней.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *