Delphi dll добавить пункт в контекстное меню
Репутация: нет
Всего: 8
Все работает как надо, но только как в меню проводника запихнуть картинку?
Многие приложения создают свои пункты с пиктограммами.
Как это сделать?
Репутация: 6
Всего: 162
Репутация: нет
Всего: 8
Не о том речь, надо в контекстное меню добавть картинку.
Я знаю, что делают это через COM, но для этого надо писать dll
Иначе нельзя?
Репутация: нет
Всего: 154
Цитата |
Я знаю, что делают это через COM, но для этого надо писать dll |
Репутация: нет
Всего: 8
Добавление пунктов в системное контекстное меню
Вы обращали внимание на то, что некоторые приложения после установки добавляют в системное контекстное меню свои собственные пункты? Так поступают многие архиваторы, антивирусные средства и другие утилиты. Эта возможность предоставляется оболочкой Windows.
Ваш СОМ-объект, который расширяет системное контекстное меню, должен поддерживать как минимум два интерфейса — ishellExtinit и IContextMenu. существует и два новых интерфейса — IContextMenu2 и icontextMenuS, но они вносят в логику работы контекстных меню лишь небольшие дополнения и здесь рассмотрены не будут. Интерфейс ishellExtinit отвечает за инициализацию меню, а интерфейс IContextMenu — за выполнение основных функций.
Методы интерфейса IContextMenu приведены в табл. 31.3.
Таблица 31.3. Методы интерфейса IContextMenu
function QueryContextMenu (Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uFlags: UINT) : HResult; stdcall;
Добавляет пункт к системному контекстному меню
function InvokeCommand(var- Ipici: TCMInvokeCommandlnfo): HResult; stdcall;
Осуществляет вызов обработчика
function GetCommandString (idCmd, uType: UINT; pwReserved: POINT; PszName: LPSTR; cchMax: UINT) : HResult; stdcall;
Возвращает описание добавленного пункта меню (подсказку или полное название)
Рассмотрим их подробнее. Параметры метода QueryContextMenu означают следующее:
// Добавить один пункт меню во всплывающее меню
Метод Getcornmandstring предоставляет системе данные о пункте меню, в частности, текст подсказки; эта подсказка будет отображаться в строке состояния Проводника, когда курсор находится в нужном месте меню.
Параметры Getcommandstring просты. Первый — idCmd — соответствует идентификатору пункта меню, второй — uType — запрос на тип информации (GCS_HELPTEXT — текст подсказки, GCS_VERB — полное название пункта меню). Наконец, параметры pszName и cchMax задают буфер, в который будут копироваться текстовые данные. Полное название необходимо системе, чтобы с его помощью вызывать предусмотренные в пункте действия программно. В примере ContMenu возврат названия (т. е. обработка запроса GCS_VERB) не предусмотрен, а в ответ на запрос GCS_HELPTEXT возвращается текстовая строка "Compile the selected Delphi project".
Наиболее сложным является метод Invokecommand. Он вызывается при выборе пользователем вставленного вами пункта меню. По сути дела метод InvokeCommand представляет собой прямой аналог обработчика onclick обычных пунктов меню (объектов TMenuitem) в Delphi.
Единственным параметром метода является структура типа TCMinvoke-commandinfo, поля которой имеют такое предназначение:
cbsize — размер структуры в байтах;
hwnd — задает дескриптор окна, которое будет владельцем диалоговых окон, вызываемых из метода;
fMask — определяет, заданы ли параметры dwHotkey/hicon;
Ipverb — вызываемая команда;
IpFarameters — параметры (если есть);
IpDirectory — рабочая папка (поле не обязательно);
nShow — флаг состояния окна, который будет передан в функцию ShowWindow (SW_*);
dwHotKey — "горячая" комбинация клавиш, которая будет сопоставляться приложению, запускаемому из этого пункта меню (только если в параметре fMask установлен флаг CMIC_MASK_HOTKEY);
hIсоn — значок, который будет сопоставляться приложению, запускаемому из этого пункта меню (только если в параметре fMask установлен флаг CMIC_MASK_ICON);
Monitor — монитор по умолчанию (поле не обязательно).
Отдельно следует остановиться на описании параметра ipverb. Как уже говорилось, он может представлять из себя как идентификатор пункта меню, так и его текст — строку, заканчивающуюся нулем. Чтобы выяснить это, нужно проверить старшее слово этого 32-разрядного параметра на равенство нулю. В примере ContMenu вызов по тексту не предусмотрен:
if (HiWord(Integer(Ipici.IpVerb)) <> 0) then
function IShellExtlnit.Initialize = SEIInitialize;
indexMenu, idCmdFirst, idCmdLast,
Вас может насторожить конструкция, описывающая переименование метода initialize интерфейса ishellExtinit. На самом деле одноименный метод имеется у объекта TComObject, и приведенный синтаксис как раз и предназначен для выхода из подобных ситуаций.
Контекстное (всплывающее) меню появляется при размещении указателя в форме или в области некоторого элемента управления и нажатии правой кнопки мыши. Обычно контекстное меню содержит команды, влияющие только на тот объект, для которого вызвано это меню, поэтому такое меню также называют локальным. На скриншоте показан примерный вид контекстного меню.
Контекстное меню в Delphi представлено компонентом PopupMenu.
Главное выбрать компонент, над которым необходимо такое всплывающее меню и в «Инспекторе объектов» в свойстве Popup Menu выбрать то Popup Menu, которое необходимо (скриншот ниже).
PopupMenu можно конструировать так же с помощью Конструктора меню. Для этого нажимаем правой кнопкой миши на компоненте (см. скриншот):
выбираем пункт меню — Menu Dessigner.
Свойства компонента PopupMenu
AutoPopup типа Boolean (определяет, появляется ли контекстное меню при щелчке правой кнопки мыши и размещении указателя на компоненте, использующем это меню). Если свойство AutoPopup имеет значение True (по умолчанию), то контекстное меню при щелчке мыши появляется автоматически. Если свойство AutoPopup имеет значение False, то меню не появляется. Однако в этом случае можно активизировать меню программно, используя метод Popup. Процедура Popup (X, Y: integer), где X и Y— координаты меню относительно левого верхнего угла экрана монитора, выводит на экран указанное контекстное меню, например: PopupMenu1.Popup(200, 200);
Alignment типа TPopupAlignment (определяет место появления контекстного меню по отношению к указателю мыши).
Свойство Alignment может принимать следующие значения:
- paLeft (положение указателя определяет положение левого верхнего угла меню) — по умолчанию;
- paCenter (положение указателя определяет положение центра меню по горизонтали);
- paRight (положение указателя определяет положение правого верхнего угла меню).
Для того чтобы контекстное меню появлялось при щелчке на компоненте, необходимо его свойству PopupMenu присвоить в качестве значения имя требуемого контекстного меню.
Записки по настройке Debian Ubuntu и Microsoft Windows
Delphi - как можно добавить свой пункт в контекстное меню проводника
Для иллюстрации объектов — расширений контекстного меню — выберем пример ContMenu (поставляется с Delphi в папке DEMOSACTIVEX SHELLEXT). В этом примере для объектов типа "проект Delphi" добавляется возможность запуска компилятора в командной строке. При вызове метода QueryContextMenu нужный пункт добавляется с помощью функции
Метод Getcornmandstring предоставляет системе данные о пункте меню, в частности, текст подсказки; эта подсказка будет отображаться в строке состояния Проводника, когда курсор находится в нужном месте меню.
Параметры Getcommandstring просты. Первый — idCmd — соответствует идентификатору пункта меню, второй — uType — запрос на тип информации (GCS_HELPTEXT — текст подсказки, GCS_VERB — полное название пункта меню). Наконец, параметры pszName и cchMax задают буфер, в который будут копироваться текстовые данные. Полное название необходимо системе, чтобы с его помощью вызывать предусмотренные в пункте действия программно. В примере ContMenu возврат названия (т. е. обработка запроса GCS_VERB) не предусмотрен, а в ответ на запрос GCS_HELPTEXT возвращается текстовая строка "Compile the selected Delphi project".
Наиболее сложным является метод Invokecommand. Он вызывается при выборе пользователем вставленного вами пункта меню. По сути дела метод InvokeCommand представляет собой прямой аналог обработчика onclick обычных пунктов меню (объектов TMenuitem) в Delphi.
Единственным параметром метода является структура типа TCMinvoke-commandinfo, поля которой имеют такое предназначение:
cbsize — размер структуры в байтах;
hwnd — задает дескриптор окна, которое будет владельцем диалоговых окон, вызываемых из метода;
fMask — определяет, заданы ли параметры dwHotkey/hicon;
Ipverb — вызываемая команда;
IpFarameters — параметры (если есть);
IpDirectory — рабочая папка (поле не обязательно);
nShow — флаг состояния окна, который будет передан в функцию ShowWindow (SW_*);
dwHotKey — "горячая" комбинация клавиш, которая будет сопоставляться приложению, запускаемому из этого пункта меню (только если в параметре fMask установлен флаг CMIC_MASK_HOTKEY);
hIсоn — значок, который будет сопоставляться приложению, запускаемому из этого пункта меню (только если в параметре fMask установлен флаг CMIC_MASK_ICON);
Monitor — монитор по умолчанию (поле не обязательно).
Отдельно следует остановиться на описании параметра ipverb. Как уже говорилось, он может представлять из себя как идентификатор пункта меню, так и его текст — строку, заканчивающуюся нулем. Чтобы выяснить это, нужно проверить старшее слово этого 32-разрядного параметра на равенство нулю. В примере ContMenu вызов по тексту не предусмотрен:
if (HiWord(Integer(Ipici.IpVerb)) <> 0) then
begin
Exit;
end;
Для создания расширения контекстного меню мы должны породить объект, поддерживающий эти интерфейсы. К сожалению, мастера, предусмотренные в Delphi, не позволяют в автоматизированном режиме создавать объекты, реализующие уже существующие интерфейсы. Поэтому и описание, и реализацию методов придется делать "по старинке", вручную. В примере ContMenu описание объекта таково:
TContextMenu = class(TComObject, IShellExtlnit, IContextMenu) private
Вас может насторожить конструкция, описывающая переименование метода initialize интерфейса ishellExtinit. На самом деле одноименный метод имеется у объекта TComObject, и приведенный синтаксис как раз и предназначен для выхода из подобных ситуаций.
Последняя часть работы — регистрация созданного обработчика. Самое подходящее место для этого — метод updateRegistry фабрики класса. Разработчики примера ContMenu породили класс TContextMenuFactory, который при регистрации СОМ-сервера регистрирует создаваемые фабрикой объекты:
Пример ContMenu иллюстрирует "дельфийский" подход к созданию серверов СОМ через соответствующие объекты из иерархии объектов Delphi. Но в папке SHELLEXT вы найдете еще один пример создания расширения для контекстного меню, сделанный целиком и только с использованием интерфейсов и функций СОМ. Присмотритесь к этому примеру внимательнее, если хотите глубже понимать внутреннюю структуру СОМ-объектов.
Возможно ли сделать в меню файла свой пункт?
Добрый день! Я сегодня делал одну прогу и задался вопросом: можно ли в этом меню сделать свой.
Добавить пункт в контекстное меню собственного контрола
Создаю свой визуальный контрол/компонент, нужно, чтобы в дизайн-тайм при вызове контекстного меню.
Добавить пункт в меню панели задач
Всем привет! Можно ли добавить пункт в меню панели задач? И как это сделать (с запуском моего.
Редактирование реестра: добавить пункт в контекстное меню
Добрый день всем! Я пытаюсь добавить свой пункт в контекстное меню в проводнике (ОС windows XP.
раздел делфи -хе2
наверно я не так написал - нужно не в моей программе - а в системном контекстном меню.
вообще нужно следующее-1. выделаю текст ( в любом месте - либо редактор, либо браузер)
2. вызывают контекстное меню - и в этом меню будет мой пункт я не спец, но подозреваю, что нужно перехватывать и подменять своим собственным меню. когда-то видел компонент, работающий подобным образом. компонент предназначался для вставки специальных символов в любое редактируемое поле. но это было давно попробуйте в сторону IContextMenu interface и дополнений (IContextMenu2, IContextMenu3, IContextMenuCB)
статья у Gunsmoker'a Как управлять IContextMenu
Как добавить пункт в контекстное меню браузера?
Здравствуйте. Как можно добавить пункт в контекстное меню браузера, так, как делают многие.
Как добавить собственный пункт в контекстное меню Excel?
Здравствуйте всем. Подскажите, пожалуйста, каким образом можно добавить собственный пункт в.
Как добавить в контекстное меню пункт, который разбивается на пункты ?
Всем привет ! Сегодня решил узнать как менять "Контекстное Меню" Прогуглил ! Узнал что если.
Добавить в контекстное меню Мой компьютер пункт Управление дисками
Можно ли добавить в контекстное меню значка "Мой компьютер" пункт Управление дисками (которое.
Как добавить пункт в контекстное меню Windows для картинок?
Как добавить пункт в контекстное меню Windows для картинок? Т.е. чтобы при вызове контекстного меню.
Как добавить пункт в контекстное меню для создания документов OpenOffice ?
Rак добавить пункт в контекстное меню для создания документов OpenOffice ?
Читайте также: