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

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

Примечание

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Так как 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 default

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

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

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

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

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

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

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

  1. Отображение
  2. Гаджеты
  3. Personalization
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell
         Display
         Gadgets
         Personalization

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

  1. Personalization
  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\, чтобы представить каскадное меню. В этом примере мы присвоим этому подразделу имя 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 можно зарегистрировать любые пользовательские команды. Преимущество этого main заключается в том, что повышенные разрешения не требуются. Кроме того, другие сопоставления файлов могут повторно использовать весь этот набор глаголов, указав тот же подраздел ExtendedSubCommandsKey. Если вам не нужно повторно использовать этот набор глаголов, можно перечислить их в родительском списке, но убедитесь, что значение по умолчанию родительского элемента является пустым.

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

  1. Создайте подраздел в HKEY_CLASSES_ROOT\оболочкеProgID\, чтобы представить каскадное меню. В этом примере мы присвоим этому подразделу имя 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
    

    Убедитесь, что значение по умолчанию подраздела Test Cascade Menu 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.

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

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

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

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

Примечание

Так как 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 является нерекомендуемой; вместо этого используйте IDropTarget . DDE является нерекомендуемой, так как для обнаружения сервера DDE используется широковещательное сообщение окна. Зависание сервера DDE приводит к зависанию сообщения окна широковещательной рассылки и, таким образом, зависает беседы DDE для других приложений. Как правило, одно зависшее приложение вызывает последующие зависания во всех взаимодействиях с пользователем.

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

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

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

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

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

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

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

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

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

Чтобы добавить команду создания файла в подменю Создать , файлы приложения должны иметь связанный тип файла. Включите подраздел ShellNew под именем файла. Если выбрана команда Создать в меню Файл, оболочка добавляет тип файла в подменю Создать. Отображаемая строка команды — это описательная строка, назначенная идентификатору ProgID программы.

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

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

 

На следующем примере раздела реестра и снимке экрана показано подменю New для типа файла .myp-ms. Он содержит команду MyProgram Application.

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

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

снимок экрана проводника Windows с новой командой myprogram application в подменю new

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

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

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

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

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

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

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

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

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

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

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

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

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

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

Тип реализации команды Документ Проигрыватель
Прежняя версия 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 задает ноль для глаголов элемента или ненулевое значение для команд в контекстном меню фона.

В следующем примере записи реестра attributeMask имеет значение 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. Создайте папку с пометкой "Только для чтения" или "Система".

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

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

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

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

Примечание

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

 

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

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

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

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

Команды и сопоставления файлов

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