我有一个用 C# 编写的 Outlook VSTO。我使用的是 Outlook 2016 (Office 365)。
我试图确定 Outlook 完全加载并更新所有商店的时刻,如果可能的话,在发生这种情况时触发一个事件,以便我可以启用/禁用功能区中的某些按钮。
我的问题是如何知道 Outlook 何时已完全实例化并在初始启动时完成加载所有商店?
我能够确定的最接近的是最后一个 Application.Reminder 事件被触发的时间,但必须有一种更简单的方法。每次将提醒加载到提醒窗口时都会触发 Application.Reminder 事件,该事件仅在所有商店更新后首次启动 Outlook 时显示,然后我希望触发自定义事件。
提出了类似的问题here没有真正的答案。
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 已 Hook 该事件,可能会产生竞争条件,则该事件似乎不会触发...如果另一个 VSTO 已卸载 - 事件会正常触发...
最佳答案
一旦我发现我需要创建提醒对象的变量,并使用该对象中的事件,而不是直接使用 Application.Reminders 事件,我的问题的答案就相对容易了。这种对事件的访问形式可以防止竞争条件,正如我所描述的,当另一个 VSTO 也访问提醒集合的事件时。
所以我的问题的解决方案是向 ThisAddin.cs 添加一个私有(private) 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 功能区中的功能区按钮。
关于c# - Outlook VSTO - 如何识别 Outlook 何时完全加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65854118/