Outlook 中约会和联系人的事件处理程序

Posted

技术标签:

【中文标题】Outlook 中约会和联系人的事件处理程序【英文标题】:EventHandler for Appointments and Contacts in Outlook 【发布时间】:2012-04-06 00:04:18 【问题描述】:

我想将 EventHandlers 用于约会和联系人(以及稍后的任务)。

我有一个执行以下代码的 ContactProgram 类:

Outlook.Items myContactItems = myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items; 
myContactItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(myContactItems_Add);
myContactItems.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(myContactItems_Change);
myContactItems.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(myContactItems_Remove);

我有一个 AppointmentPogram 类,它执行以下代码:

Outlook.Items myAppointmentItems = myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar).Items;
myAppointmentItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(myAppointmentItems_Add);
myAppointmentItems.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(myAppointmentItems_Change);
myAppointmentItems.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(myAppointmentItems_Remove);

如果我对两者都使用 EventHandler,那么 Appointment-EventHandler 将不会触发。但是,如果我注释掉创建 Contact-EventHandlers 的代码,那么 Appointment-EventHandlers 就会被触发。 (在我的程序中,首先创建联系人事件处理程序,然后创建约会事件处理程序。)

我可以只创建一次事件处理程序,然后检查作为参数给出的对象的类型。但不幸的是,联系人事件处理程序需要指向 olFolderContacts 和约会事件处理程序 olFolderCalendar。

有什么建议吗?

编辑: 我的新代码:

...
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;
public partial class ThisAddIn

    private static Outlook.Application myApplication = new Outlook.Application();
    private List<OutlookContact> allContacts = new List<OutlookContact>();
    private Outlook.Folder myContactsFolder = (Outlook.Folder)myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts);
    private ContactProgram contactProgram;

    private List<OutlookAppointment> allAppointments = new List<OutlookAppointment>();
    private Outlook.Folder myAppointmentsFolder = (Outlook.Folder)myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
    private AppointmentProgram appointmentProgram;

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    
        contactProgram = new ContactProgram(myApplication, allContacts, myContactsFolder);
        contactProgram.Start();
        appointmentProgram = new AppointmentProgram(myApplication, allAppointments, myAppointmentsFolder);
        appointmentProgram.Start();

        //initialise EventHandlers
        //myContactItems = myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items;//= myContactsFolder.Items;
        Outlook.Items myContactItems = myContactsFolder.Items;
        myContactItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(myContactItems_Add);
        myContactItems.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(myContactItems_Change);
        myContactItems.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(myContactItems_Remove);

        //myAppointmentItems = myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar).Items;
        Outlook.Items myAppointmentItems = myAppointmentsFolder.Items;
        myAppointmentItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(myAppointmentItems_Add);
        myAppointmentItems.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(myAppointmentItems_Change);
        myAppointmentItems.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(myAppointmentItems_Remove);
    

    private static void myContactItems_Add(object item)
    
        ContactProgram.myContactItems_Add(item);
    
    ...


【问题讨论】:

【参考方案1】:

您寻求的事件处理程序(ItemAddItemChangeItemRemove)在 Folder 级别完成。由于日历和联系人是不同的文件夹 - 您不能通过一次注册同时监听更改事件 - 它需要为每个 Folder 存储单独的处理程序。

如果您的事件没有触发,很可能是因为您没有将变量 myAppointmentItemsmyContactItems 保留为类级别变量的范围问题。见related SO post。

【讨论】:

嘿 SliverNinja,感谢您的快速回答。我按照 SO 帖子中的指示移动了我的代码(见上文)。我想我已经为每个文件夹存储有单独的处理程序,不是吗?问题仍然存在。一开始,EventHandlers 会触发,但后来不再触发。任何帮助将不胜感激。 有人有想法吗?我可以向您提供有关该问题的更多信息吗? Outlook.Items myContactItemsOutlook.Items myAppointmentItems 需要成为您的班级的成员 - 不要在 ThisAddIn_Startup 内声明它们,否则它们只会触发一次,直到 GC'd。如果您的事件只被触发一次 - 它肯定是您的变量被 GC 处理的范围问题。

以上是关于Outlook 中约会和联系人的事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章

VSTO Outlook 约会事件 (VB.NET)

VSTO Outlook 插件:当用户拖放定期约会时,无法在 Item_Change 事件中获取 AppointmentItem

在类约会模板内的链接按钮上设置事件处理程序不会触发

在 Access 中处理 Outlook MailItem 发送事件

那里有PDA或Outlook同步框架吗? [关闭]

java之十二 事 件 处 理