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


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

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

Примечание.

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

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

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

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

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

Примечание.

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

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

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

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

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

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

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

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

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

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

Элемент verb по умолчанию отображается первым в контекстном меню. Его назначение заключается в предоставлении Shellverb который можно использовать при вызове функции ShellExecuteEx, если verb не указано. Параметр Shell не обязательно выбирает значение по умолчанию verb , если ShellExecuteEx используется в этом режиме.

Shell использует первое доступное verb в следующем порядке:

  1. Значение по умолчанию verb
  2. Первый verb в реестре, если порядок verb указан
  3. Эти Openverb
  4. Тот Open Withverb

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

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

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

  • Так как Doit не является каноническим verb, он назначает отображаемое имя, которое можно выбрать, нажав клавишу D.
  • Printtoverb не отображается в контекстном меню. Однако его включение в реестр позволяет пользователю печатать файлы, сбрасывая их на значок принтера.
  • Для каждого из них verbотображается один подраздел. %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"

На следующей схеме показано расширение контекстного меню в соответствии с приведенными выше записями реестра. В этом контекстном меню есть Open, Do It и Print, причем Do It является командой по умолчанию verb.

Снимок экрана контекстного меню do it default verb

Активация вашего обработчика событий с помощью интерфейса 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

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

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

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. В случае пользовательских глаголов реализуйте их с помощью любого из статических verb методов реализации и поместите их в подраздел CommandStore, как показано в примере для вымышленного verbVerbName:

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

Примечание.

Этот метод имеет то преимущество, что пользовательские глаголы можно зарегистрировать один раз и повторно использовать, перечислив verb имя в разделе 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. Заполните вложенные объекты с помощью любой из следующих статических verb реализаций. Обратите внимание, что подраздел 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 и более поздних версиях можно предоставить ту же verb реализацию с помощью IExplorerCommand , что и в IContextMenu.

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

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

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

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

Примечание.

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

 

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

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

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

System.StructuredQueryType.Boolean#True

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

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

В этом примере значение DefaultAppliesTo делает это verb значение по умолчанию для любого файла со словом exampleText1 в имени файла. Значение AppliesTo активирует verb для любого файла с названием "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 Выполнение задач реализации

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

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

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

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

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

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

Чтобы добавить команду создания файла в подменю New , файлы приложения должны иметь связанный тип файла. Добавьте вложенный ключ ShellNew в имя файла. При выборе Shell команды "Создатьфайл" в подменю "Создать" добавляется тип файла. Отображаемая строка команды — это описательная строка, назначенная 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 подменю, Shell создается файл с именем New MyProgram Application.myp-ms и передает его MyProgram.exe.

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

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

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

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

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

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

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

  • Значение 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
    

Примечание.

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

 

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

Выбор статического или динамического Verb для вашего меню быстрого доступа

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

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

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

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