В пункт меню «Дополнительные действия» (Additional actions) можно добавить действия, написав смарт-тег и зарегистрировав его определенным образом.

Cмарт-теги (smart tag, в пер. с англ. — «контекстная метка») выполняют определенные контекстно-зависимые действия при распознавании текстовых фрагментов.

Смарт-теги придуманы для того, чтобы тратить минимум усилий на переключение между приложениями во время работы. Например, можно написать смарт-тег, способный распознавать номера телефонов на основе шаблона и предлагающий занести телефон с именем абонента в CRM-систему. Или смарт-тег, способный распознавать курсы валют на сайте РБК и предлагающий занести их в автоматизированную банковскую систему.

Сценарий работы смарт-тега примерно таков:

  • распознавание текстового фрагмента и отображение меню, ассоциированного с данным типом смарт-тега (класс Recognizer);
  • выполнение определенных действий (класс Action).

В Интернете имеется масса статей о создании смарт-тегов, расширяющих функциональность офисных продуктов, но лишь немногие из них описывают расширение меню «Дополнительные действия». Буду рада, если мой опыт написания такого смарт-тега на C#.NET окажется полезен читателям.

Для определенности: смарт-тегом будем называть обработчик, реализуемый в виде xml или dll.

Пути решения

Outlook 2007 предоставляет богатые возможности пользовательской настройки меню, но меню «Дополнительные действия» в имеющихся версиях Office расширить стандартными методами, к сожалению, нельзя.

В простейших случаях можно добавить элементы меню с помощью специального xml-файла, как указано в статье [2]1. Часто этого бывает достаточно, однако сложные случаи, например добавление в название элемента меню имени пользователя, придется реализовывать в виде DLL-обработчика.

Реализация

Для создания DLL-обработчика необходима библиотека типов Microsoft Smart Tags 2.0 (MSTag.tbl), которая входит в состав MS Office.

Для начала разработаем обертку (wrapper) этой биб-лиотеки, используя Visual Studio 2005.

  • Откроем Visual Studio Command Prompt (Start • Programs • Visual Studio .NET • Visual Studio .NET Tools • Visual Studio .NET 2005 Command Prompt).
  • Сгенерируем ключи для подписи сборки (strong name):
  • sn –k SmartTagLib.snk
  • Перейдем в директорию C:Program FilesCommon FilesMicrosoft SharedSmart Tag и напишем в командной строке примерно следующее:

tlbimp mstag.tlb /keyfile:c:SmartTagLib.snk /out:c:SmartTagLib.dll

указав вместо «с:» путь, где должна лежать библиотека SmartTagLib.dll.

Рассмотрим интерфейсы, предоставляемые этой библиотекой.

ISmartTagRecognizer и ISmartTagRecognizer2 отвечают за распознавание текста в документе. При создании смарт-тега для расширения меню реализовывать этот интерфейс не нужно.

А так будет выглядеть модифицированное меню MS Outlook после добавления смарт-тегов

ISmartTagAction и ISmartTagAction2 отвечают за визуализацию пункта меню и действия, которые будут происходить при его выборе. ISmartTagAction2, появившийся в Office 2003, предоставляет методы get_VerbCaptionFrom ID2 и InvokeVerb2, которые дают возможность менять отображаемое имя смарт-тега в момент инициализации. Эти методы нам помогут, когда мы будем добавлять имя пользователя в элемент меню.

Далее создадим новый проект Class Library и назовем его STPersonaMenu.

Установим ссылку на библиотеку SmartTagLib.dll (команда Project | References). Переименуем Class1 в Action и в коде класса укажем, что он будет реализовывать интерфейсы ISmartTagAction и ISmartTagAction2.

public class Action : ISmartTagAction, ISmartTagAction2

Добавим в начало кода директиву

using Microsoft.Office.Interop.SmartTag;

С помощью intelliSense добавим заглушки свойств методов интерфейсов в наш класс. Обратите внимание на следующие свойства смарт-тега.

В интерфейсе ISmartTagAction:

  • ProgId — идентификатор смарт-тега:

public string ProgId
{
get
{
return “SPAdditionalMenu.Action”;
}
}

  • Уникальное имя смарт-тега

public
System.String
get_SmartTagName
(System.Int32 SmartTagID)

{
return
“urn:schemas-microsoft-com: office:smarttags#PersonName“;
}

 

«urn:schemas-microsoft-com:office:smarttags #PersonName» — тип, включенный в Office для смарт-тега, реализующего дополнительное меню [8]1.

  • VerbCaptionFromID — название пункта меню, которое визуализируется в меню «Дополнительные действия». Если мы определим это свойство, текст, отображаемый в названии пункта меню, будет статическим. Нам же нужно, чтобы он динамически менялся, добавляя в конец имя выбранного пользователя.
  • Для этого рассмотрим подробнее интерфейс ISmartTagAction2:
  • Из списка параметров, передаваемых в VerbCaptionFromID, нам наиболее интересен Text, который содержит имя пользователя. Добавим его к названию элемента меню.

public System.String get_VerbCaptionFromID2(int VerbID, string ApplicationName, int LocaleID, ISmartTagProperties Properties, string Text, string Xml, object Target)

{
return “Личная страница пользователя“ + Text;
}

  • IsCaptionDynamic указывает, является ли заголовок элемента меню смарт-тега динамическим. Если да, то при каждом отображении меню вызывается метод SmartTagInitialize. Даже если нам не пригодится этот метод, необходимо установить параметр в true, иначе динамического добавления имени пользователя не произойдет.

public bool get_IsCaptionDynamic(int VerbID, string ApplicationName, int LocaleID)
{
return true;
}

  • InvokeVerb2 — в этом методе мы определим, что будет происходить при выборе элемента меню. В нашем случае пользователь будет перенаправляться на страницу на корпоративном портале.

public void InvokeVerb2(int VerbID, string ApplicationName, object Target, ISmartTagProperties Properties, string Text, string Xml, int LocaleID)
{
string url = “http://myCorporateUrl/personPages”;
System.Diagnostics.Process.Start( url+ ResolveDisplayNameToADName(Text));
}

Не будем описывать здесь все методы, полная реализация смарт-тега приведена на «Мир ПК-диске».

Установка

Рассмотрим случай, когда нужно сделать простенький инсталлятор для установки на несколько рабочих мест.

Подготовим смарт-тег:

  • В свойствах проекта выберем вкладку Build и установим галочку Register for Com interop.
  • Откроем AssemblyInfo.cs, найдем там ключ

[assembly: ComVisible(false)]

и установим его в true.

  • Изменим класс Action, добавив атрибуты:

[ComVisible(true),
GuidAttribute(“3b22c2ca-0edc-488c-8d97-021626ceb3a7“),
ProgIdAttribute(“STPersonaMenu.Action“)]
public class Action : ISmartTagAction, ISmartTagAction2

Понятно, что идентификатор (GUID) должен быть уникальным.

  • В свойствах проекта выберем вкладку Singing и установим галочку Sing the assembly. В появившемся выпадающем списке выберем New и создадим ключ для подписи.
  • В меню Build выберем Build solution, чтобы создать dll. В директории binDebug должно появиться три файла: dll, pdb и tlb.

Создадим установщик:

  • Сделаем новый проект Setup and Deployment и назовем его STPersonaMenuSetup.
  • Добавим в него нашу библиотеку (STPersonaMenuSetup project • Add • Project Output. В появившемся окне Add Project output Group выберем Primary Output проекта STPersonaMenu). Папка Detected dependencies будет содержать несколько файлов.

Создадим новый проект

Файлы MSTag.TLB и STPersonaMenu.tlb можно исключить из проекта. Для Primary output from STPersonaMenu и SmartTagLib.dll необходимо указать, что они будут устанавливаться в Global Assembly Cache. Для этого установите в свойствах файла параметр Folder в Global Assembly Cache Folder (возможно, по умолчанию нельзя будет выбрать папку GAC Folder, тогда ее нужно сначала добавить из меню View • File system проекта установщика).

  • Вынесем в реестр информацию о смарт-теге. Для этого откроем меню View • Registry проекта и добавим ключи в ветку HKEY_CURRENT_USER, чтобы получилось GUID должен совпадать с указанным в классе Action.

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

  • Компилируем проект и пробуем запустить.

Добавим информацию в реестр

Установщик при запуске добавит необходимые ключи в реестр и файлы SmartTag.dll и STPersonaMenu в GAC, и в MS Outlook появится новый пункт меню «Личная страница пользователя %Username%», при выборе которого будет открываться ссылка http://myCorporateUrl/personPages/%Username%.

Об авторе Дина Насыроваразработчик компании Auriga, Inc.


Литература

  1. Adding custom menu items to Microsoft Office Communicator 2007 menus http://imwire.eventure.biz/imwire/articles/22.aspx
  2. ISmartTagAction2 Interface [Office 2003 SDK Documentation] http://msdn.microsoft.com/en-us/library/aa206976(office.11).aspx
  3. Что нового в смарт-тегах Office 2003 http://www.gotdotnet.ru/LearnDotNet/XMLWebServices/29515.aspx
  4. Smart Tags and the Persona Menu [Office 2003 SDK Documentation] http://msdn.microsoft.com/en-us/library/aa195475.aspx
  5. Register the Visual C# Smart Tag DLL [Office 2003 SDK Documentation] http://msdn.microsoft.com/en-us/library/aa168710( office.11).aspx
  6. How to make a Smart Tag using C# http://www.codeproject.com/KB/cs/smarttag.aspx