2011-11-03 125 views
3

我试图用钩事件Application.ItemLoad的方法:如何捕获OutlookContact.Write事件?

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(Application_ItemLoad); 
} 

,如果目前的产品ContactItem这将检查。如果它是一个ContactItem它将检查属性ContactItem.User4是否包含值xxx。如果ContactItem.User4包含价值xxx,它会与挂钩事件ContactItem.Write另一种方法:

void Application_ItemLoad(object Item) 
     { 
      if (Item is Outlook.ContactItem) 
      { 
       Outlook.ContactItem contact = (Outlook.ContactItem)Item; 
       System.Windows.Forms.MessageBox.Show("A new contact is loaded into memory"); 

       try 
       { 
        string user4 = contact.User4; 
        bool isSynchronized = user4 != null && user4.Contains("xxx"); 

        if (isSynchronized) 
        { 
         contact.Write += propertyChangeHandler; 
        } 
       } 
       catch (Exception e) 
       { 
        System.Windows.Forms.MessageBox.Show("An error occurred: "+e); 
       } 
      } 
     } 

现在的问题是,每当我尝试访问ContactItem.User4财产,我得到一个异常:

System.Runtime.InteropServices.COMException:该项目的属性和 方法不能在此事件过程中使用。

我该怎么做,我没有得到上述错误?

感谢您阅读我长期以来的问题,并期待您的建议。

回答

1

您需要使用不同的事件。根据this post - 该项目的内容尚未加载到内存中。你应该看看Application.Inspectors事件NewInspector

+0

感谢您的回复。使用NewInspector事件执行Application_ItemLoad步骤的问题在于,PropertyChangeHandler与ContactItem.Write事件挂钩了多次。我们可以确保它只钩住一次吗? – craftsman

+0

检查器关闭后,应该断开处理程序。使用'((Outlook.InspectorEvents_10_Event)inspector).Close + = new Outlook.InspectorEvents_10_CloseEventHandler(Inpsector_Close);' – SliverNinja

+0

我应该在哪里放这段代码?如果我将它插入到NewInspector事件处理程序中,则CloseEventHandler将再次与一个检查程序连接多次。另外,Inspector_Close回调方法没有任何参数。即使我将这个方法与Close事件挂钩,我将如何获得对当前检查器或项目的引用,该事件的Write事件需要断开处理程序? – craftsman