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

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

Рекомендации

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

Рекомендации по реализации команд

В следующем списке представлены рекомендации по реализации глаголов:

  • Всегда выбирайте самый простой метод глагола, который соответствует вашим потребностям.
  • По возможности используйте метод статической команды.
  • Не выполняйте ресурсоемкие операции или операции ввода-вывода в потоке пользовательского интерфейса. И IShellExtInit::Initialize , и IContextMenu::QueryContextMenu должны быть очень консервативными в выполняемой работе. IContextMenu::InvokeCommand необходимо выполнить в другом процессе или создать новый поток, чтобы избежать блокировки вызывающего объекта.
  • Префикс глаголов с именем независимого поставщика программного обеспечения (ISV) следующим образом ISVName.verb: . Использование неквалифицированных имен может привести к конфликтам с несколькими независимыми поставщиками программного обеспечения, которые выбрали одно и то же имя глагола.
  • Всегда используйте идентификатор ProgID для конкретного приложения. Поскольку некоторые типы элементов не используют это сопоставление, необходимо использовать уникальные имена поставщиков.
  • Поместите пользовательский интерфейс относительно вызывающего метода, но не выполняйте в потоке вызывающих элементов.
  • Не принимайте возвращаемое значение S_OK для канонических глаголов, передаваемых в метод IContextMenu::InvokeCommand . Это приводит к сбою при вызове реализации реальной команды и возвращает код сбоя для канонических глаголов. Если канонические глаголы не поддерживаются, возвращается ошибка при обнаружении ненулевого значения HIWORD(lpVerb).
  • Избегайте использования rundll32.exe в качестве узла для глагола.
  • При реализации IContextMenu::QueryContextMenu обязательно возвращайте количество глаголов, добавленных в меню, с помощью значения HRESULT с помощью макроса ResultFromShort.
  • Если вы регистрируетесь в одной из следующих записей раздела реестра, будьте осторожны и обязательно зарегистрируйте обработчик в наиболее конкретном типе, чтобы избежать возможных непредвиденных последствий:
    • HKEY_CLASSES_ROOT\*
    • HKEY_CLASSES_ROOT\AllFileSystemObjects
    • HKEY_CLASSES_ROOT\Folder
    • HKEY_CLASSES_ROOT\Directory
  • Задается клавиша MayChangeDefaultMenu только в том случае, если предполагается, что в контекстном меню может потребоваться изменить команду по умолчанию. Если обработчик не изменяет команду по умолчанию, не следует задавать этот ключ, так как это приведет к тому, что система будет загружать библиотеку DLL без необходимости.
  • Сведите к минимуму работу, выполняемую в IShellExtInit::Initialize. Для обработчиков контекстного меню запишите объект данных, переданный в IShellExtInit::Initialize, а затем обработайте его в IContextMenu::QueryContextMenu или IContextMenu::InvokeCommand.

Рекомендации по использованию нескольких команд выбора

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

В Windows 7 и более поздних версиях количество элементов, передаваемых команде, ограничено 16 при запросе контекстного меню. Затем команда повторно создается и повторно инициализируется с полным выбором при вызове этой команды.

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

Разнородные выделения

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

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

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

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

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

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

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

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