首页 > 解决方案 > 有没有可靠的方法来获取 Outlook 日历的事件(如添加、更新和删除)?

问题描述

我目前正在使用 c# 开发一个 Outlook 插件项目,该项目应该监听 Outlook 日历的事件。但是我发现了一个问题,有时我的回调函数不起作用。有人可以帮助我吗?

我使用互操作库从我的日历中获取数据。

public partial class ThisAddIn{
    public Outlook.Application app = null;
    public Outlook.NameSpace ns = null;
    public Outlook.MAPIFolder calendar = null;
    public Outlook.Items appointments = null;
    public Outlook.AppointmentItem deleteItem;
    List<Outlook.Items> allItems = new List<Outlook.Items>();
    List<Outlook.AppointmentItem> allItem = new List<Outlook.AppointmentItem>();
    private void ThisAddIn_Startup(object sender, EventArgs e)
    {
        app = Application;
        ns = app.GetNamespace("mapi");
        ns.Logon("", "", true, true);
        calendar = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
        foreach (Outlook.Folder folder in calendar.Folders)
        {
            var oMailItems = folder.Items;
            allItems.Add(oMailItems);
            oMailItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(appointments_ItemAdd);
            oMailItems.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(appointments_ItemChange);
            oMailItems.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(appointments_ItemRemove);
            foreach (Outlook.AppointmentItem item in oMailItems)
            {
                item.BeforeDelete += appointments_BeforeItemDelete;
                allItem.Add(item);
            }
        }
        appointments = calendar.Items;
        allItems.Add(appointments);
        appointments.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(appointments_ItemAdd);
        appointments.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(appointments_ItemChange);
        appointments.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(appointments_ItemRemove);
        foreach (var item in appointments)
        {
            var appointment = (Outlook.AppointmentItem)item;
            appointment.BeforeDelete+=appointments_BeforeItemDelete;
            String subject = appointment.Subject;
            allItem.Add(appointment);
            Console.WriteLine(subject);
        }
    }
    private void appointments_ItemAdd(object item)
    {
        ((Outlook.AppointmentItem)item).BeforeDelete +=     appointments_BeforeItemDelete;
        saveOperation(item,"A");
    }

}

我希望每个事件都被监听,我的回调可以正确执行,但结果是事件有时无法被我的代码捕获,我什至无法总结出规律。Outlook 有时也会更改日历项的 entryId。

标签: c#

解决方案


推荐阅读