Добавление пунктов в системное контекстное меню
Вы обращали внимание на то, что некоторые приложения после установки добавляют в системное контекстное меню свои собственные пункты? Так поступают многие архиваторы, антивирусные средства и другие утилиты. Эта возможность предоставляется оболочкой Windows.
Когда пользователь щелкает правой кнопкой мыши на любом объекте в пространстве имен, система создает контекстное меню из двух частей: стандартного меню для объектов данного типа и пунктов меню, добавляемых зарегистрированными обработчиками. Зарегистрированные обработчики – это СОМ-серверы, запускаемые в адресном пространстве процесса (in-process servers) и реализованные в виде динамических библиотек.
Ваш СОМ-объект, который расширяет системное контекстное меню, должен поддерживать как минимум два интерфейса – IshellExtinit и IContextMenu. существует и два новых интерфейса – IContextMenu2 и IcontextMenu3, но они вносят в логику работы контекстных меню лишь небольшие дополнения и здесь рассмотрены не будут. Интерфейс 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 означают следующее:
- Menu – дескриптор системного меню;
- IndexMenu – позиция в меню, в которую следует вставить пункт (пункты);
- IdCmdFirst, IdCmdLast – диапазон допустимых значений для идентификаторов вставляемых пунктов меню;
- uFlags – набор флагов, главные из которых означают:
- CMF_NORMAL – обычный вызов контекстного меню, пункты могут быть добавлены. Значение этого флага нулевое, проверять его следует, очистив все биты в параметре uFlags, кроме пяти младших (маска $1F);
- CMF_DEFAULTONLY – устанавливается, если пользователь задал с объектом действие по умолчанию (например, двойной щелчок). В этом случае пункты меню добавляться не должны;
- CMF_VERBSONLY – устанавливается, если меню создается для ярлыка объекта, а не для самого объекта. В этом случае многие пункты меню создаваться не должны;
- CMF_EXPLORE – устанавливается, если меню создается для объекта, находящегося на левой панели Проводника.