我正在C#中开发一个outlook插件。
我希望能够检测outlook何时完成了";发送/接收";选项,这样我就可以对收到的邮件项目运行操作。
到目前为止我尝试过的:
-
启动时手动调用
Application.Session.SendAndReceive()
。这运行得很好,但该方法在发送/接收完成之前返回,这与我想要的相反 -
覆盖Application.NewMail和Application.NewMailEx-这两个触发器都不是启动时所希望的(NewMailEx根本不会启动,NewMail不可靠(
-
调用
NameSpace.SyncObjects.AppFolders.Start();
并注册SyncObjects.AppFolders.SyncEnd
事件-此事件在outlook完成下载邮件之前触发 -
通过
NameSpace.SyncObjects
循环,调用Start()
,并注册SyncEnd
-此方法根本不会启动。
这里的解决方案是什么?
似乎有一个黑客可以检测同步何时完成;即如DWE在此SO答案中所建议的那样覆盖CCD_ 7此事件(在我的测试中(总是在outlook同步完成后触发。然后,为了确保提醒窗口启动,您在启动时添加一个新的提醒,然后在Reminders_BeforReminderShow 中再次隐藏提醒
代码是这样的:
public partial class ThisAddIn
{
private ReminderCollectionEvents_Event reminders; //don't delete, or else the GC will break things
AppointmentItem hiddenReminder;
private void ThisAddIn_Startup(object sender, EventArgs e)
{
//other stuff
hiddenReminder = (AppointmentItem)Application.CreateItem(OlItemType.olAppointmentItem); //add a new silent reminder to trigger Reminders_BeforeReminderShow.This method will be triggered after send/receive is finished
hiddenReminder.Start = DateTime.Now;
hiddenReminder.Subject = "Autogenerated Outlook Plugin Reminder";
hiddenReminder.Save();
reminders = Application.Reminders;
reminders.BeforeReminderShow += Reminders_BeforeReminderShow;
}
private void Reminders_BeforeReminderShow(ref bool Cancel)
{
if (hiddenReminder == null) return;
bool anyVisibleReminders = false;
for (int i = Application.Reminders.Count; i >= 1; i--)
{
if (Application.Reminders[i].Caption == "Autogenerated Outlook Plugin Reminder") //|| Application.Reminders[i].Item == privateReminder
{
Application.Reminders[i].Dismiss();
}
else
{
if (Application.Reminders[i].IsVisible)
{
anyVisibleReminders = true;
}
}
}
Cancel = !anyVisibleReminders;
hiddenReminder?.Delete();
hiddenReminder = null;
//your custom code here
}
}
是的,这是非常笨拙的,但这就是使用outlook的本质,我还没有看到任何免费的替代方案可以声称可靠地工作,而这在我尝试过的所有用例中都有效。所以这是我愿意接受的一个成功的解决方案。