Иллюстрированный самоучитель по Delphi 7 для профессионалов

Добавление пунктов в системное контекстное меню

Вы обращали внимание на то, что некоторые приложения после установки добавляют в системное контекстное меню свои собственные пункты? Так поступают многие архиваторы, антивирусные средства и другие утилиты. Эта возможность предоставляется оболочкой 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 – устанавливается, если меню создается для объекта, находящегося на левой панели Проводника.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.