В пункт меню «Дополнительные действия» (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 отвечают за распознавание текста в документе. При создании смарт-тега для расширения меню реализовывать этот интерфейс не нужно.
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.
Литература
-
Adding custom menu items to Microsoft Office Communicator 2007 menus http://imwire.eventure.biz/imwire/articles/22.aspx
-
Additional Actions when right-clicking a From or To address.http://www.crmreports.com/index.php/additional-actions-when-right-clicking-a-from-or-to-address.html
-
ISmartTagAction2 Interface [Office 2003 SDK Documentation] http://msdn.microsoft.com/en-us/library/aa206976(office.11).aspx
-
Что нового в смарт-тегах Office 2003 http://www.gotdotnet.ru/LearnDotNet/XMLWebServices/29515.aspx
-
Smart Tags and the Persona Menu [Office 2003 SDK Documentation] http://msdn.microsoft.com/en-us/library/aa195475.aspx
-
Register the Visual C# Smart Tag DLL [Office 2003 SDK Documentation] http://msdn.microsoft.com/en-us/library/aa168710( office.11).aspx
-
Build and Deploy a .NET COM http://www.simple-talk.com/dotnet/visual-studio/build-and-deploy-a-.net-com-assembly/
-
How to make a Smart Tag using C# http://www.codeproject.com/KB/cs/smarttag.aspx