Skip to main content
 首页 » 编程设计

c#之事件处理程序未添加到新邮件项目

2024年02月01日34jpfss

我正在尝试创建一个简单的 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) 
    { 
    } 

请您参考如下方法:

引发事件的 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) 
    { 
    }