Расширение контекстных меню

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

Дополнительные сведения доступны здесь:

Контекстные меню для объектов файловой системы

Когда пользователь щелкает правой кнопкой мыши объект, например файл, который отображается в Windows Обозреватель или на рабочем столе, контекстное меню отображается со списком команд. Затем пользователь может выполнить действие в файле, например открыть или удалить его, выбрав соответствующую команду.

Так как контекстные меню часто используются для управления файлами, оболочка предоставляет набор команд по умолчанию, таких как "Вырезать" и "Копировать", которые отображаются в контекстном меню для любого файла. Обратите внимание, что хотя Open With является командой по умолчанию, она не отображается для некоторых стандартных типов файлов, таких как WAV. На следующем рисунке примера каталога "Мои документы", который также использовался в качестве примера в разделе "Настройка значков", отображается контекстное меню по умолчанию, отображаемое правой кнопкой мыши MyDocs4.xyz.

screen shot of the default shortcut menu for file system objects

Причина, по которой MyDocs4.xyz отображает контекстное меню по умолчанию, заключается в том, что он не является членом зарегистрированного типа файла. С другой стороны, txt — это зарегистрированный тип файла. Если щелкнуть правой кнопкой мыши один из txt-файлов, вы увидите контекстное меню с двумя дополнительными командами в верхнем разделе: Открытие и печать.

screen shot of the customized shortcut menu for file system objects

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

Все, что необходимо для расширения контекстного меню для типа файла, заключается в создании записи реестра для каждой команды. Более сложный подход — реализовать обработчик контекстного меню, который позволяет расширить контекстное меню для типа файла на основе файла. Дополнительные сведения см. в разделе "Создание обработчиков контекстного меню".

Команды контекстного меню

Каждая команда в контекстном меню определяется в реестре по его команде. Эти команды совпадают с теми, которые используются ShellExecuteEx при запуске приложений программным способом. Дополнительные сведения об использовании ShellExecuteExecuteEx см. в обсуждении в разделе "Запуск приложений".

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

"My Program.exe" "%1"

"%1" — это стандартный заполнитель для параметра командной строки, предоставленного именем файла. Например, он может указать определенную страницу, отображаемую в представлении табуляции.

Примечание.

Если любой элемент командной строки содержит или может содержать пробелы, он должен быть заключен в кавычки. В противном случае, если элемент содержит пробел, он не будет правильно анализироваться. Например, "My Program.exe" запустит приложение правильно. Если вы используете My Program.exe, система попытается запустить "My" с "Program.exe" в качестве первого аргумента командной строки. Всегда следует использовать кавычки с аргументами, такими как "%1", которые развернуты в строках оболочки, так как не удается убедиться, что строка не будет содержать пробел.

 

Команды также могут иметь строку отображения, связанную с ними, которая отображается в контекстном меню вместо самой строки команды. Например, строка отображения для openas — Open With. Как и обычные строки меню, включая амперсанд (&) в отображаемой строке, позволяет выбрать клавиатуру команды.

Канонические глаголы

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

Канонические команды включают:

значение Описание
открыт Открывает файл или папку.
opennew Открывает файл или папку в новом окне.
…печать. Выводит файл.
Исследовать Открывает windows Обозреватель с выбранной папкой.
поиск Открывает диалоговое окно поиска Windows с папкой, заданной в качестве расположения поиска по умолчанию.
openas Открывает диалоговое окно "Открыть с помощью ".
свойства Открывает лист свойств объекта.

 

Глагол printto также канонический, но никогда не отображается. Он позволяет пользователю распечатать файл, перетащив его в объект принтера.

Расширенные команды

Когда пользователь щелкает объект правой кнопкой мыши, контекстное меню содержит все обычные команды. Однако могут быть команды, которые вы хотите поддерживать, но не отображались в каждом контекстном меню. Например, можно использовать команды, которые обычно не используются или предназначены для опытных пользователей. По этой причине можно также определить одну или несколько расширенных команд. Эти команды также являются символьными строками и похожи на обычные команды. Они отличаются от обычных глаголов по способу их регистрации. Чтобы получить доступ к командам, связанным с расширенными командами, пользователь должен щелкнуть правой кнопкой мыши объект при нажатии клавиши SHIFT. Затем расширенные команды будут отображаться вместе с обычными командами.

Расширение контекстного меню для типа файла

Самый простой способ расширения контекстного меню для типа файла — с реестром. Для этого добавьте подключ оболочки под ключом progID приложения, связанного с типом файла. При необходимости можно определить команду по умолчанию для типа файла, сделав его значением по умолчанию подраздела Shell .

Команда по умолчанию сначала отображается в контекстном меню. Его цель — предоставить оболочку с командой, которую она может использовать при вызове ShellExecuteExuteEx , но не указана команда. Оболочка не обязательно выбирает глагол по умолчанию, если ShellExecuteEx используется таким образом. Для версий Оболочки 5.0 и более поздних версий, найденных в системах Windows 2000 и более поздних версий, оболочка использует первую доступную команду из следующего списка. Если нет, операция завершается ошибкой.

  • Открытая команда
  • Команда по умолчанию
  • Первая команда в реестре
  • Команда openwith

Для версий Оболочки до версии 5.0 опустите третий элемент.

Под подразделом оболочки создайте один подраздел для каждой команды, которую вы хотите добавить. Каждый из этих подразделов будет иметь значение REG_SZ для отображаемой строки команды. Вы можете опустить отображаемую строку для канонических команд, так как система автоматически отобразит правильно локализованную строку. Если опустить отображаемую строку для неканонических команд, отобразится строка команды. Для каждого подраздела команды создайте подраздел команды со значением по умолчанию, заданным для командной строки.

На следующем рисунке показано контекстное меню типа файла MYP, используемого в типах файлов и значках настройки. Теперь он имеет открытые, doit, печать и глаголы printto в контекстном меню с doit в качестве команды по умолчанию. Контекстное меню выглядит следующим образом.

screen shot of the customized shortcut menu

Записи реестра, используемые для расширения контекстного меню, показанного на предыдущем рисунке:

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      Shell
         (Default) = doit
         open
            command
               (Default) = C:\MyDir\MyProgram.exe "%1"
         doit
            (Default) = &Do It
            command
               (Default) = C:\MyDir\MyProgram.exe /d "%1"
         print
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1"
         printto
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1" "%2" %3 %4

Хотя команда Open With выше первого разделителя, она автоматически создается системой и не требует записи реестра. Система автоматически создает отображаемые имена для канонических команд, открытых и печатных. Так как doit не является канонической командой, она назначает отображаемое имя "&Do It", которое можно выбрать, нажав клавишу D. Команда printto не отображается в контекстном меню, но в том числе позволяет пользователю печатать файлы, сбрасывая их на значок принтера. В этом примере %1 представляет имя файла и %2 имя принтера.

Команды можно подавлять с помощью параметров политики, добавив значение SuppressPolicy в ключ команды. Задайте для идентификатора политики значение SuppressionPolicy. Если политика включена, команда и соответствующая запись контекстного меню подавляются. Возможные значения идентификаторов политики см. в перечислении RESTRICTIONS .

Расширение контекстного меню для предопределенных объектов оболочки

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

Список предопределенных объектов можно найти в разделе "Предопределенные объекты оболочки" в разделе "Создание обработчиков расширений оболочки". Эти предопределенные объекты Оболочки, контекстные меню которых можно расширить, добавив команды в реестр, помечены в таблице словом "Verb".

Регистрация приложения для обработки произвольных типов файлов

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

Процедура по умолчанию служит двумя основными целями. Один из них — указать способ вызова приложения для открытия произвольного типа файла. Например, можно использовать флаг командной строки, чтобы указать, что открывается неизвестный тип файла. Другая цель заключается в определении различных характеристик типа файла, таких как контекстное меню и значок. Если пользователь связывает приложение с дополнительным типом файла, этот тип будет иметь эти характеристики. Если дополнительный тип файла был ранее связан с другим приложением, эти характеристики заменят исходные данные.

Чтобы зарегистрировать процедуру по умолчанию, поместите те же разделы реестра, которые вы создали для progID приложения в подразделе приложения HKEY_CLASSES_ROOT\Application. Вы также можете включить значение FriendlyAppName, чтобы предоставить системе понятное имя приложения. Понятное имя приложения также может быть извлечено из исполняемого файла, но только в том случае, если значение FriendlyAppName отсутствует. В следующем фрагменте реестра показана пример процедуры по умолчанию для MyProgram.exe, которая определяет понятное имя и несколько контекстных элементов меню. Строки команд включают флаг /a, чтобы уведомить приложение о том, что он открывает произвольный тип файла. Если вы включаете вложенный ключ DefaultIcon , следует использовать универсальный значок.

HKEY_CLASSES_ROOT
   Applications
      MyProgram.exe
         FriendlyAppName = Friendly Name
         shell
            open
               command
                  (Default) = C:\MyDir\MyProgram.exe /a "%1"
            print
               command
                  (Default) = C:\MyDir\MyProgram.exe /a /p "%1"
            printto
               command
                  (Default) = C:\MyDir\MyProgram.exe /a /p "%1" "%2" %3 %4

Расширение нового подменю

Когда пользователь открывает меню "Файл" в Windows Обозреватель, первая команда — "Создать". При выборе этой команды отображается подменю. По умолчанию она содержит две команды, папки и ярлыки, которые позволяют пользователям создавать вложенные папки и сочетания клавиш. Этот подменю можно расширить, чтобы включить команды создания файлов для любого типа файла.

Чтобы добавить команду создания файла в подменю New, файлы приложения должны иметь тип файла, связанный с ними. Добавьте вложенный ключ ShellNew в ключ для расширения имени файла. Когда выбрана команда "Создать файл", оболочка добавит ее в новый подменю. Отображаемая строка команды будет описательной строкой, назначенной progID программы.

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

значение Описание
Command Выполняет приложение. Это REG_SZ значение, указывающее путь выполнения приложения. Например, можно задать для запуска мастера.
Data Создает файл, содержащий указанные данные. Данные — это значение REG_BINARY с данными файла. Данные игнорируются, если задано значение NULLFile или FileName.
FileName Создает файл, который является копией указанного файла. FileName — это значение REG_SZ , задайте полный путь к файлу для копирования.
NullFile Создает пустой файл. NullFile не назначается значение. Если задан nullFile, значения Data и FileName игнорируются.

 

На следующем рисунке показан новый подменю для типа файла MYP, используемого в качестве примера в файлах типов и значках настройки. Теперь у него есть команда MyProgram Application. Когда пользователь выбирает приложение MyProgram в подменю New, оболочка создает файл с именем New MyProgram Application.myp и передает его в MyProgram.exe.

screen shot of the custom new menu

Теперь запись реестра выглядит следующим образом:

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
      MyProgram.1
         ShellNew
            NullFile
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = C:\MyDir\MyProgram.exe,2
      Shell
         (Default) = doit
         open
            command
               (Default) = C:\MyDir\MyProgram.exe "%1"
         doit
            (Default) = &Do It
            command
               (Default) = C:\MyDir\MyProgram.exe /d "%1"
         print
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1"
         printto
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1" "%2" %3 %4