2011-11-03 129 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