Поделиться через


Создание обработчиков контекстного меню

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

Примечание.

При регистрации обработчиков, работающих в контексте 32-разрядных приложений на 64-разрядных версиях Windows, нужно учитывать, что система WOW64 перенаправляет доступ файловой системы к некоторым путям при вызове в контексте приложения иной разрядности. Если обработчик .exe хранится в одном из этих путей, он недоступен в этом контексте. Таким образом, в качестве обходного пути либо храните ваш .exe файл в папке, которая не перенаправляется, либо храните заглушку вашего .exe файла, которая запускает реальную версию.

Этот раздел организован следующим образом:

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

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

Канонический глагол Описание
Открыть Открывает файл или папку.
Opennew Открывает файл или папку в новом окне.
Печать Выводит файл.
Printto Позволяет пользователю распечатать файл, перетащив его в объект принтера.
Исследовать Открывает проводник Windows с выбранной папкой.
Свойства Открывает лист свойств объекта.

Примечание.

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

Обработчики контекстного меню могут предоставлять собственные канонические команды через IContextMenu::GetCommandString с GCS_VERBW или GCS_VERBA. Система будет использовать канонические команды в качестве второго параметра (lpOperation), переданного ShellExecute, и является CMINVOKECOMMANDINFO.Член lpVerb, переданный методу IContextMenu::InvokeCommand.

Расширенные глаголы

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

Реестр можно использовать для определения одного или нескольких расширенных глаголов. Связанные команды будут отображаться только в том случае, если пользователь щелкает объект правой кнопкой мыши, а также нажимает клавишу SHIFT. Чтобы определить глагол как расширенный, добавьте значение "extended" REG_SZ в подраздел глагола. Значение не должно быть связано с данными.

Глаголы только для программного доступа

Эти глаголы никогда не отображаются в контекстном меню. К этим данным можно получить доступ с помощью ShellExecuteEx и указания поля lpVerb параметра pExecInfo (объекта SHELLEXECUTEINFO). Чтобы определить глагол как доступный только для программного доступа, добавьте значение "ProgrammaticAccessOnly" REG_SZ в подраздел глагола. Значение не должно иметь каких-либо данных, связанных с ним.

Реестр можно использовать для определения одного или нескольких расширенных глаголов. Связанные команды будут отображаться только в том случае, если пользователь щелкает объект правой кнопкой мыши, а также нажимает клавишу SHIFT. Чтобы определить глагол как расширенный, добавьте значение "расширенный" REG_SZ в подраздел глагола. Значение не должно быть связано с данными.

Настройка контекстного меню с помощью статических команд

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

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

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

  1. Глагол по умолчанию
  2. Первый глагол в реестре, если указан порядок следования глаголов
  3. Команда Open
  4. Команда Open With

Если ни одна из перечисленных команд не доступна, операция завершается ошибкой.

Создайте один подраздел для каждого глагола, который вы хотите добавить в подраздел Shell. Каждый из этих подразделов должен иметь значение типа REG_SZ для строки отображения глагола (локализованной строки). Для каждого подраздела команды создайте подраздел команды со значением по умолчанию, заданным в командной строке для активации элементов. Для канонических команд, таких как Open and Print, можно опустить отображаемую строку, так как система автоматически отображает правильно локализованную строку. Для неканонических глаголов, если вы упустите отображаемую строку, отображается строка глагола.

В следующем примере реестра обратите внимание, что:

  • Так как Doit не является каноническим глаголом, ему назначается отображаемое имя, которое можно выбрать, нажав клавишу D.
  • Команда Printto не отображается в контекстном меню. Однако его включение в реестр позволяет пользователю печатать файлы, сбрасывая их на значок принтера.
  • Для каждого глагола отображается один подключ. %1 представляет имя файла и %2 имя принтера.
HKEY_CLASSES_ROOT
   .myp-ms
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = My Program Application
      Shell
         (Default) = doit
         doit
            (Default) = &Do It
            command
               (Default) = c:\MyDir\MyProgram.exe /d "%1"
         open
            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"

На следующей схеме показано расширение контекстного меню в соответствии с приведенными выше записями реестра. Это контекстное меню содержит команды "Открыть", "Do It" и "Печать " в меню, используя команду Do It в качестве команды по умолчанию.

Снимок экрана: контекстное меню команды «Выполнить по умолчанию»

Активация вашего обработчика событий с помощью интерфейса IDropTarget

Динамический обмен данными (DDE) не рекомендуется; вместо этого используйте IDropTarget . IDropTarget является более надежным и имеет лучшую поддержку активации, так как она использует COM-активацию обработчика. В случае выбора нескольких элементов IDropTarget не распространяется на ограничения размера буфера, найденные как в DDE, так и в CreateProcess. Кроме того, элементы передаются приложению в качестве объекта данных, который можно преобразовать в массив элементов с помощью функции SHCreateShellItemArrayFromDataObject. Это проще и не теряет сведения о пространстве имен, как происходит при преобразовании элемента в путь для протоколов командной строки или DDE.

Дополнительные сведения о запросах IDropTarget и Shell для атрибутов сопоставления файлов см. в разделе "Предполагаемые типы" и "Регистрация приложений".

Указание позиции и порядка статических глаголов

Обычно глаголы упорядочены в контекстном меню на основе перечисления; перечисление основано сначала на порядке массива ассоциаций, а затем по порядку элементов в массиве ассоциаций, как определено порядком сортировки, определённым реестром.

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

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

  1. Отображать
  2. Гаджеты
  3. Персонализация
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell
         Display
         Gadgets
         Personalization

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

  1. Персонализация
  2. Гаджеты
  3. Дисплей
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell = "Personalization,Gadgets"
      Display

Размещение команд в верхней или нижней части меню

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

Position=Top | Bottom 

Создание статических каскадных меню

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

На следующем снимке экрана представлен пример каскадного меню.

Снимок экрана, показывающий пример каскадного меню

В Windows 7 и более поздних версиях существует три способа создания каскадных меню:

Создание каскадных меню с помощью записи реестра SubCommands

В Windows 7 и более поздних версиях можно использовать запись SubCommands для создания каскадных меню с помощью следующей процедуры.

Создание каскадного меню с помощью записи SubCommands

  1. Создайте подраздел в HKEY_CLASSES_ROOT\ProgID\shell, чтобы представить каскадное меню. В этом примере мы предоставим этому подразделу имя CascadeTest. Убедитесь, что значение по умолчанию подраздела CascadeTest является пустым и отображается как (значение не задано).

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
    
  2. В вложенный ключ CascadeTest добавьте запись MUIVerb типа REG_SZ и назначьте текст, который будет отображаться в контекстном меню. В этом примере мы назначаем ему "Тестовое каскадное меню".

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu
    
  3. В вложенный ключ CascadeTest добавьте запись SubCommands типа REG_SZ, которая назначена списку, разделяемая точками с запятой, из команд, которые должны отображаться в меню в порядке внешнего вида. Например, здесь мы назначаем несколько системных глаголов.

    HKEY_CLASSES_ROOT
       *
          Shell
             CascadeTest
                SubCommands
                Windows.delete;Windows.properties;Windows.rename;Windows.cut;Windows.copy;Windows.paste
    
  4. В случае пользовательских глаголов реализуйте их с помощью любого из методов статической реализации глагола и перечислите их в подразделе CommandStore, как показано в этом примере для вымышленного глагола VerbName:

    HKEY_LOCAL_MACHINE
       Software
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      CommandStore
                         Shell
                            VerbName
                            command
                               (Default) = notepad.exe %1
    

Примечание.

Этот метод имеет то преимущество, что пользовательские глаголы можно зарегистрировать один раз и повторно использовать, указав имя глагола в записи SubCommands. Однако приложению требуется разрешение на изменение реестра в HKEY_LOCAL_MACHINE.

 

Создание каскадных меню с помощью записи реестра ExtendedSubCommandsKey

В Windows 7 и более поздних версиях можно использовать запись ExtendedSubCommandKey для создания расширенных каскадных меню: каскадных меню внутри каскадных меню.

На следующем снимке экрана показан пример расширенного каскадного меню.

Снимок экрана: расширенное каскадное меню для устройств

Так как HKEY_CLASSES_ROOT является сочетанием HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE, вы можете зарегистрировать любые пользовательские глаголы в подразделе HKEY_CURRENT_USER\Software\Classes. Основное преимущество заключается в том, что повышенные разрешения не требуются. Кроме того, другие ассоциации файлов могут повторно использовать этот набор команд, указав тот же подраздел ExtendedSubCommandsKey. Если вам не нужно повторно использовать этот набор команд, можно перечислить команды в родительском элементе, но убедитесь, что значение по умолчанию родительского элемента пусто.

Создание каскадного меню с помощью записи ExtendedSubCommandsKey

  1. Создайте подраздел в HKEY_CLASSES_ROOT\ProgID\shell, чтобы представить каскадное меню. В этом примере мы предоставим этому подразделу имя CascadeTest2. Убедитесь, что значение по умолчанию подраздела CascadeTest является пустым и отображается как (значение не задано).

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest2
                (Default)
    
  2. В ваш ключ CascadeTest добавьте запись MUIVerb типа REG_SZ и назначьте ей текст, который будет отображаться как ее название в меню ярлыка. В этом примере мы назначаем ему "Тестовое каскадное меню".

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu 2
    
  3. В созданном подразделе CascadeTest добавьте подраздел ExtendedSubCommandsKey , а затем добавьте подкоманда документа (типа REG_SZ ); например:

    HKEY_CLASSES_ROOT
       txtfile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Layout
                   Properties
                   Select all
    

    Убедитесь, что значение по умолчанию подраздела Тест каскадного меню 2 является пустым и отображается как (значение не задано).

  4. Заполните подглаголы, используя любую из следующих реализаций статических глаголов. Обратите внимание, что подраздел CommandFlags представляет значения EXPCMDFLAGS. Если вы хотите добавить разделитель до или после каскадного элемента меню, используйте ECF_SEPARATORBEFORE (0x20) или ECF_SEPARATORAFTER (0x40). Описание этих флагов Windows 7 и более поздних версий см. в разделе IExplorerCommand::GetFlags. ECF_SEPARATORBEFORE работает только для элементов меню верхнего уровня. MUIVerb имеет тип REG_SZ, а CommandFlags имеет тип REG_DWORD.

    HKEY_CLASSES_ROOT
       txtile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Shell
                      cmd1
                         MUIVerb = Notepad
                         command
                            (Default) = %SystemRoot%\system32\notepad.exe %1
                      cmd2
                         MUIVerb = Wordpad
                         CommandFlags = 0x20
                         command
                            (Default) = "C:\Program Files\Windows NT\Accessories\wordpad.exe" %1
    

На следующем снимке экрана приведена иллюстрация предыдущих примеров записи реестра.

Снимок экрана, показывающий пример каскадного меню с вариантами Блокнот и WordPad

Создание каскадных меню с помощью интерфейса IExplorerCommand

Другим вариантом добавления глаголов в каскадное меню является IExplorerCommand::EnumSubCommands. Этот метод позволяет источникам данных, предоставляющим команды модуля команд с помощью IExplorerCommandProvider, использовать эти команды как глаголы в контекстном меню. В Windows 7 и более поздних версиях можно предоставить ту же реализацию глагола с помощью IExplorerCommand, что и с помощью IContextMenu.

На следующих двух снимках экрана показано использование каскадных меню в папке "Устройства ".

Снимок экрана: пример каскадного меню в папке устройств.

На следующем снимке экрана показана другая реализация каскадного меню в папке "Устройства ".

Снимок экрана: пример каскадного меню в папке устройств

Примечание.

Так как IExplorerCommand поддерживает только внутрипроцессную активацию, рекомендуется использовать источниками данных оболочки, которые должны совместно использовать реализацию между командами и контекстными меню.

 

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

Расширенный синтаксис запросов (AQS) может выразить условие, которое будет оцениваться по свойствам элемента, для которого создается экземпляр глагола. Эта система работает только с быстрыми свойствами. Это свойства, которые источник данных оболочки сообщает как быстрые, не возвращая SHCOLSTATE_SLOW из IShellFolder2::GetDefaultColumnState.

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

System.StructuredQueryType.Boolean#True

В следующем примере записи реестра:

  • Значение AppliesTo определяет, отображается ли глагол или скрыт.
  • Значение DefaultAppliesTo определяет, какой глагол является глаголом по умолчанию.
  • Значение HasLUAShield управляет тем, отображается ли значок щита контроля учетных записей пользователей (UAC).

В этом примере значение DefaultAppliesTo делает этот глагол значением по умолчанию для любого файла, в имени которого есть слово exampleText1. Значение AppliesTo включает действие для любого файла, в имени которого присутствует "exampleText1". Значение HasLUAShield отображает щит для файлов, содержащих "exampleText2" в названии.

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            DefaultAppliesTo = System.ItemName:"exampleText1"
            HasLUAShield = System.ItemName:"exampleText2"
            AppliesTo = System.ItemName:"exampleText1"

Добавьте подключ Command и значение:

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            Command
               (Default) = %SystemRoot%\system32\notepad.exe %1

В реестре Windows 7 посмотрите HKEY_CLASSES_ROOT\диск как пример команд BitLocker, которые используют следующий подход:

  • AppliesTo = System.Volume.BitlockerProtection:=2
  • System.Volume.BitlockerRequiresAdmin:=System.StructuredQueryType.Boolean#True

Дополнительные сведения об AQS см. в разделе "Расширенный синтаксис запросов".

Устарело: Связывание глаголов с командами DDE (Dynamic Data Exchange)

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

Метод IDropTarget является более надежным и имеет лучшую поддержку активации, так как он использует COM-активацию обработчика. В случае выбора нескольких элементов IDropTarget не распространяется на ограничения размера буфера, найденные как в DDE, так и в CreateProcess. Кроме того, элементы передаются приложению в качестве объекта данных, который можно преобразовать в массив элементов с помощью функции SHCreateShellItemArrayFromDataObject. Это проще и сохраняет сведения о пространстве имен, в отличие от случая, когда элемент преобразуется в путь для протоколов командной строки или DDE.

Дополнительные сведения о запросах IDropTarget и Shell для атрибутов сопоставления файлов см. в разделе "Предполагаемые типы" и "Регистрация приложений".

Выполнение задач по реализацию глаголов

Следующие задачи для реализации глаголов актуальны как для статических, так и для динамических реализаций глаголов. Дополнительные сведения о динамических командах см. в разделе "Настройка контекстного меню с помощью динамических команд".

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

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

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

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

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

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

Чтобы указать метод создания файла, задайте одно или несколько значений данных подразделу ShellNew. Доступные значения перечислены в следующей таблице.

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

 

В следующем примере раздела реестра и снимке экрана продемонстрировано новое подменю для типа файла .myp-ms. У него есть команда MyProgram Application.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
      MyProgram.1
         ShellNew
         NullFile

Снимок экрана иллюстрирует новый подменю. Когда пользователь выбирает приложение MyProgram в подменю New , оболочка создает файл с именем New MyProgram Application.myp-ms и передает его в MyProgram.exe.

Снимок экрана проводника windows, показывающий новую команду

Создание обработчиков перетаскивания

Базовая процедура реализации обработчика перетаскивания аналогична обычным обработчикам контекстного меню. Однако обработчики контекстного меню обычно используют только указатель IDataObject, передаваемый методу IShellExtInit::Initialize для извлечения имени объекта. Обработчик перетаскивания может реализовать более сложный обработчик данных для изменения поведения перетаскиваемого объекта.

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

Снимок экрана: контекстное меню перетаскивания

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

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

Добавьте подключ под DragDropHandlers с именем обработчика перетаскивания и задайте значение по умолчанию этого подключа в строковое представление идентификатора класса обработчика (CLSID). В следующем примере включается обработчик перетаскивания MyDD .

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers
            MyDD
               (Default) = {MyDD CLSID GUID}

Подавление глаголов и управление видимостью

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

Использование модели выбора глагола

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

  • Укажите значение MultiSelectModel для всех глаголов. Если значение MultiSelectModel не указано, оно выводится из выбранного типа реализации команды. Предполагается, что для методов на основе COM (например, DropTarget и ExecuteCommand) используется проигрыватель , а для других методов — Document .
  • Укажите одиночный для глаголов, поддерживающих только один вариант выбора.
  • Укажите Player для глаголов, поддерживающих любое количество элементов.
  • Укажите документ для команд, создающих окно верхнего уровня для каждого элемента. Это ограничивает количество активированных элементов и помогает избежать превышения системных ресурсов, если пользователь открывает слишком много окон.

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

Тип реализации глагола Документ Игрок
Наследие 15 элементов 100 элементов
COM 15 элементов Без ограничений

 

Ниже приведены примеры записей реестра с помощью значения MultiSelectModel.

HKEY_CLASSES_ROOT
   Folder
      shell
         open
             = MultiSelectModel = Document
HKEY_CLASSES_ROOT
   ProgID
      shell
         verb
             = MultiSelectModel = Single | Document | Player

Использование атрибутов элементов

Значения флага SFGAO атрибутов оболочки элемента можно проверить, чтобы определить, следует ли активировать или деактивировать действие.

Чтобы использовать эту функцию атрибута, добавьте следующие значения REG_DWORD под глаголом:

  • Значение AttributeMask указывает значение SFGAO битовых значений маски для тестирования.
  • Значение AttributeValue указывает значение SFGAO тестируемых битов.
  • В параметре ImpliedSelectionModel указано нулевое значение для глаголов элементов, либо ненулевое значение для глаголов в фоновом контекстном меню.

В следующем примере записи реестра атрибутMask имеет значение SFGAO_READONLY (0x40000).

HKEY_CLASSES_ROOT
   txtfile
      Shell
         test.verb2
            AttributeMask = 0x40000
            AttributeValue = 0x0
            ImpliedSelectionModel = 0x0
            command
               (Default) = %SystemRoot%\system32\notepad.exe %1

Реализация пользовательских команд для папок с помощью файла Desktop.ini

В Windows 7 и более поздних версиях можно добавлять глаголы в папку, используя Desktop.ini. Дополнительные сведения о файлах Desktop.ini см. в разделе "Настройка папок с помощью Desktop.ini".

Примечание.

Desktop.ini файлы всегда должны быть помечены как системные + скрытые, чтобы они не отображались пользователям.

 

Чтобы добавить пользовательские команды для папок через файл Desktop.ini, выполните следующие действия:

  1. Создайте папку, помеченную только для чтения или system.

  2. Создайте файл Desktop.ini, содержащий [. ShellClassInfo] DirectoryClass=Folder ProgID.

  3. В реестре создайте идентификатор progID папки HKEY_CLASSES_ROOT\со значением CanUseForDirectory. Значение CanUseForDirectory позволяет избежать неправильного использования идентификаторов ProgID, которые не участвуют в реализации пользовательских команд для папок через Desktop.ini.

  4. Добавьте глаголы в подраздел "ПапкаProgID", например:

    HKEY_CLASSES_ROOT
       CustomFolderType
          Shell
             MyVerb
                command
                   (Default) = %SystemRoot%\system32\notepad.exe %1\desktop.ini
    

Примечание.

Эти глаголы могут быть глаголами по умолчанию, в этом случае двойной щелчок по папке активирует глагол.

 

Рекомендации по обработчикам контекстного меню и нескольким командам выбора

Выбор статической или динамической команды для контекстного меню

Настройка контекстного меню с помощью динамических команд

Контекстные меню и обработчики контекстного меню

Глаголы и ассоциации файлов

Справочник по меню быстрого доступа