Задача
Нужно реализовать всплывающее окно в Outlook 2016, если число получателей письма больше одного.
Вот что получилось. Исходники. Инсталлятор.
Средства
Visual Studio 2017 Community Edition + VSTO (Visual Studio Tools for Office).
Tools → Get Tools And Features → вкладка Workloads → ставим галочку на Office/Sharepoint Development.
после установки открываем Visual Studio.
File → New → Project → слева Installed → Visual C# → Office/Share Point → VSTO AddIns → Outlook 2013 and 2016 Add-in
Алгоритм
Для начала я попытаюсь реализовать самый простой вариант.
При нажатии кнопки Send моя надстойка будет проверять количество реципиентов. Если их больше 1 - показываем диалоговое окно с вопросом “Слать/Не слать”…
Реализация
using System; using Outlook = Microsoft.Office.Interop.Outlook; using System.Windows.Forms; using Microsoft.Office.Interop.Outlook; namespace Multiple_Recipients_PopUP { public partial class ThisAddIn { private void ThisAddIn_Startup(object sender, System.EventArgs e) { this.Application.ItemSend += new ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend); } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { // Note: Outlook no longer raises this event. If you have code that // must run when Outlook shuts down, see https://go.microsoft.com/fwlink/?LinkId=506785 } void Application_ItemSend(object Item, ref bool Cancel) { Outlook.MailItem currentMailItem = Item as Outlook.MailItem; if (currentMailItem != null) { if (currentMailItem.Recipients.Count > 1) { string message = "Send mail to {0} people?"; string caption = "More than one recipient..."; MessageBoxButtons buttons = MessageBoxButtons.YesNo; DialogResult result; result = MessageBox.Show(String.Format(message, currentMailItem.Recipients.Count), caption, buttons); if (result == DialogResult.No) { Cancel = true; return; } } } } #region VSTO generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InternalStartup() { this.Startup += new System.EventHandler(ThisAddIn_Startup); this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); } #endregion } }
Проверка того, что все работает
Жмем Build → Publish …
Выбираем папку, куда опубликуется наша надстройка и выбираем тип - я выбрал CD-ROM.
В результате в выбранной папке появится файлик setup.exe и файлы надстройки, с помощью которых можно установить созданную надстройку.
Развертывание
Creating a Basic Installer for VSTO project
Разворачивать полученную надстройку можно либо с помощью Cick-Once, либо с помощью Microsoft Installer.
Как написано тут Cick-Once не позволяет развернуть надстройку сразу для всех пользователей компа/сервера. Однако, мне надо развернуть ее на терминальном сервере.
Развертывание с помощью Visual Studio Installer
Скачиваем и устанавливаем Microsoft Visual Studio 2017 Installer Projects
В Solution Explorer жмакаем правой кнопкой по солюшену и создаем новый проект - Add → New Project… → Other Project Types → Visual Studio Installer → Setup Project.
Нам надо добавить файлы надстройки и записи в реестре.
Добавляем файлы
В Solution Explorer жмакаем правой кнопкой по проекту → Add → Project Output…
Там в поле Project выбран наш единственный проект, а из списка выбираем Primary Output.
В результате в проект инсталлятора добавится dll нашей надстройки и необходимые зависимости.
Кроме того, надо добавить файлы *.vsto и *.manifest, которые лежат в папке с собранной надстройкой.
В Solution Explorer жмакаем правой кнопкой по проекту → Add → File… и находим файлы *.vsto и *.manifest из папки bin\Release.
В Solution Explorer жмакаем правой кнопкой по проекту → View → File System.
Кликаем по Application Folder и справа в строке DefaultLocationуказываем путь установки. Обычно это [ProgramFilesFolder][Manufacturer]\[ProductName], а значения входящих в путь переменных в свою очередь заданы в свойствах проекта.
Добавляем записи в реестр
В Solution Explorer жмакаем правой кнопкой по проекту → View → Registry.
Дальше делаем в соответствии с этим - Registry entries for VSTO Add-ins
В окошке Registry On target Machine добавляем ключи: HKLM\Software\Microsoft\Office\Outlook\Addins\Multiple_Recipients_PopUP
И добавляем описанные параметры.
Путь к манифесту задаем как [ProgramFilesFolder][Manufacturer]\[ProductName]\…
В качестве манифеста указываем файл vsto из корня. На сборочной машине у меня файл реестра был указан как filename.vsto|vstolocal. При разворачивании |vstolocal не нужен. Путь к манифесту указываем без |vstolocal.
Правильные значения этих параметров можно поглядеть на компе на котором собиралась и тестировалась надстройка.
Выбираем установку для всех пользователей
В Solution Explorer кликаем по проекту и справа в окне свойств меняем значение поля InstallAllUsers на True.
Публикация с помощью политик GPO
Тестирование и отладка
В моем случае - после того как я проверил работу моей надстройки на своей машине, собрал инсталлятор и установил надстройку на целевой сервер она нормально появилась в Outlook 2016 у пользователя, но запускаться отказывалась.
Для того, чтобы посмотреть какую ошибку выдает надстройка при запуске нужно:
- открыть окошко cmd и задать переменной VSTO_SUPPRESSDISPLAYALERTS значение 0
set VSTO_SUPPRESSDISPLAYALERTS=0
- Запустить Outlook из этого окошка.
C:\Program Files (x86)\Microsoft Office\Office16\OUTLOOK.EXE
Затем в Outlook → File → Options → Add-Ins → Manage COM Add-ins Go… → ставим галочку на оснастке и жмем OK. В результате появится окно с сообщением и кнопкой Details.
Discussion