Вы можете вызвать контекстное меню для объекта Windows
Обновлено: 21.11.2024
Во время тестирования элементов управления меню вы можете использовать определенные свойства и методы соответствующего объекта программы для выполнения определенных действий и получения данных, хранящихся в элементах управления. Вы можете вызывать эти методы и свойства из тестов ключевых слов, а также из скриптов. В этом разделе описывается, как работать с необходимыми свойствами и методами из ваших скриптов. Однако при тестировании элемента управления из теста ключевого слова вы можете использовать те же методы и свойства, вызывая их из операций тестирования ключевого слова. Дополнительные сведения см. в разделе Основные операции проверки ключевых слов.
Для выполнения операций с контекстным (всплывающим) меню его необходимо сначала открыть на экране. В этом разделе описываются различные подходы, которые можно использовать для вызова контекстного меню в скриптах, и объясняется, как проверить, действительно ли контекстное меню отображалось в результате имитируемых действий.
Отображение контекстного меню для Windows и элементов управления
Вы можете вызвать контекстное меню для окна или элемента управления следующими способами:
-
Имитируя щелчок правой кнопкой мыши по окну или элементу управления. Для этого можно использовать действие ClickR, общее для всех экранных объектов, или аналогичные действия различных объектов, которые используются для работы с элементами управления — ClickItemR, ClickCellR, ClickCellRXY и другие (вы можете изучить элемент управления в Обозревателе объектов чтобы узнать, какие действия он поддерживает).
Действие ClickR имеет три параметра — ClientX , ClientY и Shift . Параметры ClientX и ClientY задают координаты точки в окне или элементе управления, по которому будет выполнен щелчок. Если они опущены, клик будет выполнен в центре окна или элемента управления. Параметр Shift указывает клавиши Shift ( Ctrl , Shift , Alt ) или их комбинацию, которые должны быть «нажаты» во время клика (см. TShiftKey).
Ниже приведены два примера, демонстрирующие, как можно вставить текст из буфера обмена в конец текста в Блокноте с помощью команды контекстного меню Вставить (блокнот должен быть запущен). Они выполняют одни и те же операции, но различаются только способом вызова контекстного меню: в первом примере используется действие ClickR, а во втором имитируется нажатие клавиши приложения.
Вы можете добавить элементы контекстного меню в существующие контекстные меню для определенного класса объектов в оснастке «Пользователи и компьютеры Active Directory». Вы также можете добавить страницы свойств на страницу свойств определенного класса объектов.
Например, вы можете создать расширение контекстного меню, которое добавляет элементы меню в контекстное меню класса контактов. Когда пользователь просматривает объект контакта, элементы вашего контекстного меню отображаются вместе с другими элементами контекстного меню в контекстном меню контакта.
В этом разделе приведены общие инструкции по написанию расширений контекстного меню и страниц свойств для оснастки «Пользователи и компьютеры Active Directory». Дополнительные сведения о создании оснастки, которая одновременно является контекстным меню и расширением листа свойств, см. в разделе Расширение пользователей и компьютеров Active Directory.
Оснастка — это внутрипроцессная DLL-библиотека COM-сервера, которая предоставляет MMC определенные интерфейсы. Оснастка может содержать один или несколько COM-объектов, необходимых для предоставления интерфейсов оснастки MMC.
Чтобы расширить контекстные меню элементами контекстного меню из оснастки расширения
- Создайте оснастку расширения контекстного меню. Оснастка должна реализовывать и предоставлять интерфейс IExtendContextMenu. Дополнительные сведения о создании оснастки расширения контекста см. в разделе Расширение контекстного меню основной оснастки.
- Установите оснастку расширения контекстного меню на компьютеры, на которых вы хотите использовать элементы контекстного меню расширения. Рекомендуется создать пакет Microsoft Installer для подключаемой DLL-библиотеки и соответствующим образом развернуть пакет с помощью групповой политики. Дополнительную информацию см. в разделе Интеграция с установщиком Microsoft.
- Зарегистрируйте оснастку расширения контекстного меню для определенного класса объектов, чтобы его элементы контекстного меню добавлялись в контекстные меню объектов этого класса. Имейте в виду, что вы можете зарегистрировать один и тот же объект расширения контекстного меню для нескольких классов.
- При вызове метода AddMenuItems вашей оснастки значение piDataObject, передаваемое при вызове, является указателем на объект данных выбранного в данный момент объекта Active Directory. Ваша оснастка может вызвать метод GetData объекта данных, используя формат буфера обмена CFSTR_DSOBJECTNAMES, чтобы извлечь контекстную информацию о выбранном объекте Active Directory.
Чтобы расширить листы свойств страницами свойств из оснастки расширения
При использовании COM для создания DLL расширения контекстного меню для службы каталогов Active Directory это расширение должно быть зарегистрировано в реестре Windows и в доменных службах Active Directory, чтобы уведомлять административные оснастки MMC Active Directory и оболочку Windows о расширение.
Регистрация в реестре Windows
Как и все COM-серверы, расширение контекстного меню должно быть зарегистрировано в реестре. Расширение зарегистрировано под следующим ключом.
— это строковое представление CLSID, созданное функцией StringFromCLSID. Под ключом находится ключ InProcServer32, который идентифицирует объект как 32-битный внутрипроцессный сервер. В ключе InProcServer32 расположение библиотеки DLL указано в значении по умолчанию, а модель многопоточности указана в значении ThreadingModel. Все расширения контекстного меню должны использовать потоковую модель "Квартира".
Регистрация в доменных службах Active Directory
Регистрация расширения контекстного меню зависит от одной локали. Если расширение контекстного меню применяется ко всем локали, оно должно быть зарегистрировано в объекте класса объекта displaySpecifier во всех подконтейнерах локали в контейнере спецификаторов отображения. Если расширение контекстного меню локализовано для определенной локали, оно должно быть зарегистрировано в объекте displaySpecifier в подконтейнере этой локали. Дополнительные сведения о контейнере Display Specifiers и языковых стандартах см. в разделе Display Specifiers и DisplaySpecifiers Container.
Есть два атрибута спецификатора отображения, под которыми может быть зарегистрирован элемент расширения контекстного меню. Это adminContextMenu и shellContextMenu.
Атрибут adminContextMenu определяет контекстные меню администрирования для отображения в административных оснастках Active Directory. Контекстное меню появляется, когда пользователь отображает контекстное меню для объектов соответствующего класса в одной из административных оснасток MMC Active Directory.
Атрибут shellContextMenu определяет контекстные меню конечного пользователя, которые должны отображаться в оболочке Windows. Контекстное меню появляется, когда пользователь просматривает контекстное меню для объектов соответствующего класса в проводнике Windows. Начиная с Windows Server 2003, оболочка Windows больше не отображает объекты доменных служб Active Directory.
Все эти атрибуты являются многозначными.
При регистрации расширения контекстного меню значения атрибутов adminContextMenu и shellContextMenu должны иметь следующий формат.
" – это число без знака, обозначающее положение элемента в контекстном меню. Когда отображается контекстное меню, значения сортируются с использованием сравнения " " каждого значения. Если несколько значений имеют одно и то же " ", эти расширения контекстного меню загружаются в том порядке, в котором они считываются с сервера Active Directory. Если возможно, используйте несуществующий " ", то есть тот, который не использовался другими значениями в свойстве. Начальная позиция не определена, и в последовательности " " допускаются пробелы.
" " – это строковое представление CLSID, созданное функцией StringFromCLSID.
В оболочке Windows поддерживаются пункты контекстного меню с множественным выбором. В этом случае расширение контекстного меню вызывается для каждого выбранного объекта. В административных оснастках Active Directory также поддерживаются элементы расширения контекстного меню с множественным выбором. В этом случае структура DSOBJECTNAMES будет содержать структуру DSOBJECT для каждого выбранного объекта каталога.
Для оболочки Windows информация спецификатора дисплея извлекается при входе пользователя в систему и кэшируется для сеанса пользователя. Для административных оснасток данные спецификатора отображения извлекаются при загрузке оснастки и кэшируются на время процесса. Для оболочки Windows это означает, что изменения спецификаторов отображения вступают в силу после того, как пользователь выйдет из системы и снова войдет в нее. Для административных оснасток изменения вступают в силу при перезагрузке оснастки или файла консоли, т. е. если вы запускаете новый экземпляр файла консоли или новый экземпляр Mmc.exe и добавляете оснастку, отображается последний данные спецификатора извлекаются.
Дополнительную информацию и пример кода реализации расширения контекстного меню см. в разделе Пример кода для реализации COM-объекта контекстного меню.
Расширение контекстного меню — это COM-объект, реализованный как внутрипроцессный сервер. Расширение контекстного меню должно реализовывать интерфейсы IShellExtInit и IContextMenu. Расширение контекстного меню создается, когда пользователь отображает контекстное меню для объекта класса, для которого зарегистрировано расширение контекстного меню.
Реализация IShellExtInit
После создания экземпляра COM-объекта расширения контекстного меню вызывается метод IShellExtInit::Initialize. IShellExtInit::Initialize предоставляет расширению контекстного меню объект IDataObject, содержащий данные, относящиеся к объекту каталога, к которому применяется контекстное меню.
IDataObject содержит данные в формате CFSTR_DSOBJECTNAMES. Формат данных CFSTR_DSOBJECTNAMES — это HGLOBAL, содержащий структуру DSOBJECTNAMES. Структура DSOBJECTNAMES содержит данные об объекте каталога, к которому применяется расширение листа свойств.
IDataObject также содержит данные в формате CFSTR_DS_DISPLAY_SPEC_OPTIONS. Формат данных CFSTR_DS_DISPLAY_SPEC_OPTIONS — это HGLOBAL, содержащий структуру DSDISPLAYSPECOPTIONS. DSDISPLAYSPECOPTIONS содержит данные конфигурации для использования расширением.
Если IShellExtInit::Initialize возвращает какое-либо значение, кроме S_OK, расширение контекстного меню использоваться не будет.
Параметры pidlFolder и hkeyProgID метода IShellExtInit::Initialize не используются.
Реализация IContextMenu
После возврата IShellExtInit::Initialize вызывается метод IContextMenu::QueryContextMenu для получения пункта меню или пунктов, которые добавит расширение контекстного меню. Реализация QueryContextMenu довольно проста. Расширение контекстного меню добавляет свои пункты меню, используя InsertMenuItem или аналогичную функцию. Идентификаторы команд меню должны быть больше или равны idCmdFirst и должны быть меньше idCmdLast. QueryContextMenu должен возвращать наибольший числовой идентификатор, добавленный в меню, плюс один. Лучший способ назначить идентификаторы команд меню — начать с нуля и работать последовательно. Если расширению контекстного меню не нужны никакие элементы меню, оно не должно просто добавлять какие-либо элементы в меню и возвращать ноль из QueryContextMenu.
IContextMenu::GetCommandString вызывается для извлечения текстовых данных для элемента меню, таких как текст справки, который должен отображаться для элемента меню. Возможно, хост контекстного меню будет использовать строки Unicode, а расширение использует строки ANSI. Из-за этого случаи GCS_HELPTEXTA, GCS_HELPTEXTW, GCS_VERBA и GCS_VERBW должны обрабатываться отдельно. Реализация этого метода не является обязательной.
IContextMenu::InvokeCommand вызывается при выборе одного из пунктов меню, установленных расширением контекстного меню. Контекстное меню выполняет или инициирует нужные действия в ответ на этот метод.
Читайте также: