Надстройка Outlook VSTO, как получить ссылку на новую встречу, инициированную пользователем

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

public partial class ThisAddIn
{
    Outlook.Explorer currentExplorer = null;
    private Outlook.AppointmentItem appointmentItem = null;
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        currentExplorer = this.Application.ActiveExplorer();
        currentExplorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(CurrentExplorer_Event);
   
    }


    private void CurrentExplorer_Event()
    {  

        String expMessage = "default";
        try
        {
            if (this.Application.ActiveExplorer().Selection.Count > 0)
            {
                Object selObject = this.Application.ActiveExplorer().Selection[1];
                if (selObject is Outlook.AppointmentItem)
                {
                    appointmentItem = (selObject as Outlook.AppointmentItem);
                    expMessage = "The item is an appointment. The subject is " + appointmentItem.Subject + ".";
                    MessageBox.Show(expMessage);
                }
            }
        }
        catch (Exception ex)
        {
            expMessage = "Error happened " +  ex.Message;
        }
        
    }

Однако, когда пользователь инициирует новую встречу, this.Application.ActiveExplorer().Selection.Count равно 0.

Я хотел посмотреть, как мы можем получить ссылку на Outlook AppointmentItem, который был запущен пользователем и еще не был сохранен.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
16
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Outlook.AppointmentItem appointment = null;
            Outlook.Inspector inspector = Globals.ThisAddIn.Application.ActiveInspector();
            if (inspector.CurrentItem is Outlook.AppointmentItem)
                appointment = inspector.CurrentItem as Outlook.AppointmentItem;

Не совсем правильно. Нет необходимости смешивать событие исследователя SelectionChange и инспекторов.

Eugene Astafiev 10.04.2022 11:58

Вы можете использовать либо событие Inspectors.NewInspector, когда отображается новая новая встреча, либо событие Items.ItemAdd в папке MAPIFolder, соответствующей папке календаря, после сохранения новой встречи.

Ответ принят как подходящий

Вы пытаетесь смешивать разные окна Outlook (инспекторы и проводники), чтобы получить туда элементы. Если вам нужно получить элемент, когда пользователь создает новый элемент встречи, вам необходимо обработать событие новый инспектор, которое запускается всякий раз, когда открывается новое окно инспектора, либо в результате действия пользователя, либо через программный код. Вы можете различать существующие элементы и новые, проверив свойство EntryID, которое возвращает пустую строку в случае новых элементов. Значение свойства EntryID устанавливается при сохранении элемента в магазине.

Таким образом, нет необходимости обрабатывать событие SelectionChange, которое запускается, когда пользователь выбирает другой или дополнительный элемент Microsoft Outlook программно или посредством взаимодействия с пользовательским интерфейсом. Это событие также происходит, когда пользователь (программно или через пользовательский интерфейс) щелкает или переключается на другую папку, содержащую элементы, поскольку Outlook автоматически выбирает первый элемент в этой папке.

class Connect
{
    // Connect class-level Instance Variables
    // Outlook inspectors collection
    private Outlook.Inspectors inspectors;

    public Connect(Outlook.Inspectors Inspectors)
    {
        inspectors = Inspectors;
        
        // Hook up NewInspector event
        inspectors.NewInspector += new 
            Outlook.InspectorsEvents_NewInspectorEventHandler(
                inspectors_NewInspector);
    }

    // NewInspector event creates new instance of OutlookInspector
    void inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        // use the CurrentItem to get the item object
        // inspector.CurrentItem
    }
 
}

Таким образом, нет необходимости использовать свойство ActiveInspector.

Вам может быть полезна статья Реализуйте оболочку для инспекторов и отслеживайте события на уровне элементов в каждом инспекторе..

Другие вопросы по теме