Рекомендации по обработчикам контекстного меню и нескольким командам
Этот раздел организован следующим образом:
Рекомендации
Статическое глагол — это простые команды для реализации и предоставление расширенных функциональных возможностей. Настоятельно рекомендуется реализовать команду с помощью одного из методов статической команды.
Рекомендации по реализации команд
В следующем списке представлены рекомендации по реализации команд.
- Всегда выбирает самый простой метод команды, соответствующий вашим потребностям.
- При возможности используйте статический метод глагола.
- Не выполняйте ресурсоемкие операции или операции ввода-вывода в потоке пользовательского интерфейса. Оба объекта 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 должна указывать на то, что некоторые элементы не удалось создать резервную копию.
См. также