首页 > 解决方案 > Outlook VSTO - 如何识别 Outlook 何时完全加载

问题描述

我有一个用 C# 编写的 Outlook VSTO。我正在使用 Outlook 2016 (Office 365)。

我正在尝试确定 Outlook 完全加载和更新所有商店的时刻,并在发生这种情况时触发事件,以便我可以启用/禁用功能区中的某些按钮。

我的问题是我如何知道 Outlook 在初始启动时已完全实例化并完成加载所有商店?

我能够确定的最接近的是最后一个 Application.Reminder 事件何时触发,但必须有一种更简单的方法。每次将提醒加载到提醒窗口时都会触发 Application.Reminder 事件,该事件仅在所有商店都更新后在 Outlook 的初始启动时显示,大约在那时我希望触发自定义事件。

这里提出了一个类似的问题,但没有真正的答案。

MTIA

达林

编辑 1:我已经确定可以使用 Application.Reminders.BeforeReminderShow 事件捕获我正在寻找的事件 - 此事件在显示提醒窗口之前触发。

该事件可以连接到应用程序启动事件中..

Application.Reminders.BeforeReminderShow += Reminders_BeforeReminderShow;

private void Reminders_BeforeReminderShow(ref bool Cancel)
{
    Debug.WriteLine("Reminders_BeforeReminderShow");
    MessageBox.Show("Reminders_BeforeReminderShow");
}

但是,如果另一个 VSTO 已挂钩该事件,可能会创建竞争条件,则该事件似乎也不会触发......如果另一个 VSTO 被卸载 - 事件正常触发......

标签: c#outlookvstooutlook-addin

解决方案


一旦我弄清楚我需要创建一个提醒对象的变量,并使用来自该对象的事件,而不是直接使用 Application.Reminders 事件,我的问题的答案就相对容易了。当另一个 VSTO 也访问 Reminders 集合的事件时,这种对事件的访问形式阻止了竞争条件,正如我所描述的那样。

所以我的问题的解决方案是向 ThisAddin.cs 添加一个私有的 Reminders 对象:

  private Outlook.Reminders m_Reminders;

然后在 ThisAddIn_Startup 中实例化事件监听器:

   m_Reminders = Application.Reminders;
   m_Reminders.BeforeReminderShow += Reminders_BeforeReminderShow;

监听器的事件代码如下:

   private void Reminders_BeforeReminderShow(ref bool Cancel)
   {
        Debug.WriteLine("Reminders_BeforeReminderShow");
        MessageBox.Show("Reminders_BeforeReminderShow");
   }

BeforeReminderShow 事件是在应用程序被实例化并且商店的初始更新完成之后触发的最后一个事件。

虽然我的示例没有显示它,但我有一个小方法被调用并更新 VSTO 功能区中的功能区按钮。


推荐阅读