2014-07-04 33 views
1

我試圖創建一個簡單的Outlook 2010加載項來響應新的附件事件。 下面的代碼僅在取消註釋MessageBox.Show行時有效。但隨着它被刪除它似乎不添加事件處理程序。我錯過了什麼程序流程,這意味着模態消息框會影響事件處理程序的位置?事件處理程序未被添加到新的郵件項目

public partial class ThisAddIn 
{ 
    private void ThisAddIn_Startup(object sender, System.EventArgs e) 
    { 
     Application.Inspectors.NewInspector += Inspectors_NewInspector; 
    } 

    void Inspectors_NewInspector(Outlook.Inspector Inspector) 
    { 
     Outlook.MailItem mailItem = Inspector.CurrentItem as Outlook.MailItem; 
     if (mailItem != null) 
     { 
      if (mailItem.EntryID == null) 
      { 
       mailItem.BeforeAttachmentAdd += mailItem_BeforeAttachmentAdd; 
       //System.Windows.Forms.MessageBox.Show("Twice"); 
      } 
     } 
    } 

    void mailItem_BeforeAttachmentAdd(Outlook.Attachment Attachment, ref bool Cancel) 
    { 
     Cancel = true; 
    } 

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
    { 
    } 
+0

你怎麼知道處理程序沒有附加?您在註釋代碼之前和之後是否在'mailItem_BeforeAttachmentAdd()'內部放置了一個斷點,以查看事件是否觸發? –

+0

只要在事件處理程序中添加斷點,一切都按預期工作。如果在行上添加一個斷點,則取消= true;斷點永遠不會到達。 如果將斷點添加到處理程序行並且取消= true;然後到達兩個斷點。 – elaverick

+0

是否有可能存在競爭條件? – Aelphaeis

回答

4

引發事件的COM對象必須處於活動狀態。在你的情況下,你使用多點表示法,編譯器創建一個隱式變量;一旦該變量被垃圾收集,它將停止觸發事件。郵件項目的同上 - 您需要捕獲inspector.Close事件並從_mailItems列表中刪除項目;

public partial class ThisAddIn 
{ 
    private Inspectors _inspectors; 
    private List<MailItem> _mailItems = new List<MailItem>(); 

    private void ThisAddIn_Startup(object sender, System.EventArgs e) 
    { 
     _inspectors = Application.Inspectors; 
     _inspectors.NewInspector += Inspectors_NewInspector; 
    } 

    void Inspectors_NewInspector(Outlook.Inspector Inspector) 
    { 
     Outlook.MailItem mailItem = Inspector.CurrentItem as Outlook.MailItem; 
     if (mailItem != null) 
     { 
      if (mailItem.EntryID == null) 
      { 
       _mailItems.Add(mailItem): 
       mailItem.BeforeAttachmentAdd += mailItem_BeforeAttachmentAdd; 
       //System.Windows.Forms.MessageBox.Show("Twice"); 
      } 
     } 
    } 

    void mailItem_BeforeAttachmentAdd(Outlook.Attachment Attachment, ref bool Cancel) 
    { 
     Cancel = true; 
    } 

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
    { 
    } 
相關問題