【问题标题】:How to capture OutlookContact.Write event?如何捕获 OutlookContact.Write 事件?
【发布时间】:2011-11-03 14:35:29
【问题描述】:

我正在尝试用 Application.ItemLoad 事件挂钩一个方法:

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:项目的属性和 方法不能在此事件过程中使用。

没有出现上述错误该怎么办?

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

【问题讨论】:

    标签: c# vsto outlook-2007


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。使用 NewInspector 事件执行 Application_ItemLoad 步骤的问题是 propertyChangeHandler 与 ContactItem.Write 事件多次挂钩。我们能保证它只被钩住一次吗?
    • 您应该在检查器关闭后断开处理程序。使用((Outlook.InspectorEvents_10_Event)inspector).Close += new Outlook.InspectorEvents_10_CloseEventHandler(Inpsector_Close);
    • 我应该把这段代码放在哪里?如果我将它插入到 NewInspector 事件处理程序中,CloseEventHandler 将再次与一个检查器连接多次。此外,Inspector_Close 回调方法没有任何参数。即使我将此方法与 Close 事件挂钩,我将如何从我需要断开处理程序的 Write 事件中获取对当前检查器或项目的引用?
    • @craftsman 你需要实现一个 Inspector Wrapper msdn.microsoft.com/en-us/library/ff973716.aspx
    • @SilverNinja 非常感谢您的建议。 InspectorWrapper 效果很好。
    猜你喜欢
    • 2010-10-29
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2020-10-05
    • 2018-02-20
    相关资源
    最近更新 更多