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


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

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

Примечание.

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

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

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

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

Каноническая команда Description
Открытый Открывает файл или папку.
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 приложения, связанного с типом файла. При необходимости можно определить команду по умолчанию для типа файла, сделав его значением по умолчанию подраздела 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 для атрибутов сопоставления файлов см. в разделе "Предполагаемые типы" и "Регистрация приложений".

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

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

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

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

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

    Убедитесь, что значение по умолчанию подраздела "Каскадное меню теста 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 см. в разделе "Расширенный синтаксис запросов".

Не рекомендуется: связывание команд с динамическими командами Exchange данных

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

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

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

Выполнение задач реализации команды

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

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

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

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

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

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

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

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

Значение подраздела ShellNew Description
Command Выполняет приложение. Это REG_SZ значение указывает путь выполнения приложения. Например, можно задать для запуска мастера.
Data Создает файл, содержащий указанные данные. Это REG_BINARY значение указывает данные файла. Данные игнорируются, если задано значение NULLFile или FileName .
FileName Создает файл, который является копией указанного файла. Это REG_SZ значение указывает полный путь копируемых файлов.
NullFile Создает пустой файл. 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 можно использовать для управления видимостью команды. Команды можно подавлять с помощью параметров политики, добавив значение SuppressPolicy или значение GUID SuppressPolicyEx в подраздел реестра команды. Задайте для подключа SuppressionPolicy значение идентификатора политики. Если политика включена, команда и соответствующая запись контекстного меню подавляются. Возможные значения идентификаторов политики см. в перечислении RESTRICTIONS .

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

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

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

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

Тип реализации команды Документ 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
    

Примечание.

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

 

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

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

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

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

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

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